Hibernate连表查询 Hibernate连表查询
根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### Hibernate 连表查询基础 Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发人员将Java对象模型映射到数据库表,并在对象和数据库之间进行转换。在实际开发过程中,我们经常会遇到需要从多个表中获取数据的情况,这时就需要用到连表查询。 #### 1. HBM 映射文件 在提供的内容中,出现了两个HBM映射文件:`TopProductsDeputy.hbm.xml` 和 `TopProducts.hbm.xml`。这些文件定义了Java对象和数据库表之间的映射关系。为了实现连表查询,我们需要确保这些映射文件正确地指定了关联关系。 #### 2. DAO 层的连表查询实现 代码片段中展示了如何在DAO层实现连表查询。这里使用了HQL(Hibernate Query Language)来执行查询。例如,在`getProductsMenuSub`方法中,通过以下HQL语句实现了连表查询: ```java String queryString = "select a.productsName from TopProducts as a, TopProductsDeputy as b where a.productsId = b.productsId and b.productsClass='" + classCode + "' and b.productsWebSite='" + WEBNAME + "'"; ``` 这段代码首先指定了两个实体类(`TopProducts`和`TopProductsDeputy`),然后通过`a.productsId = b.productsId`来关联这两个表,并根据传入的参数进行过滤。 ### 使用原生SQL进行连表查询 除了使用HQL外,还可以选择直接使用原生SQL来执行连表查询。例如,在`findAllbyString`方法中,使用了`getSession().createSQLQuery`方法来执行原生SQL查询: ```java String queryString = "Select * from h_attribute t where ciid=24 and Isinstance=1 and Isdisplay=1"; Query queryObject = getSession().createSQLQuery(queryString); ``` 这种方式适用于那些较为复杂的SQL查询,尤其是在HQL无法满足需求的情况下。 ### 查询结果处理 对于连表查询的结果处理,通常有两种常见的方式: #### 1. 获取单个字段值 如果只需要查询结果中的一个或几个字段,可以像下面这样处理: ```java for (int i = 0; i < list.size(); i++) { Object[] o = (Object[]) list.get(i); System.out.println(o[0]); // 输出第一个字段的值 System.out.println(o[1]); // 输出第二个字段的值 } ``` #### 2. 获取多个字段值并封装成对象 如果查询结果包含多个字段,并且希望将这些字段封装成一个对象,则可以使用Hibernate的投影列表功能,或者手动创建一个新的类来存储查询结果。 ### 总结 本文主要介绍了Hibernate中的连表查询方法及其在实际开发中的应用。通过对HBM映射文件的理解、DAO层的连表查询实现以及查询结果的处理等几个方面进行了详细解释。在实际项目中,合理运用这些技巧可以极大地提高开发效率和代码质量。需要注意的是,在编写连表查询时要充分考虑性能问题,避免因查询复杂度过高而导致性能瓶颈。
首先生成2个表的HBM文件(注意,在建立HBM之前一定要参照“Hibernate建立HBM文件时候必须不要勾选的选项.jpg” 建立)
<mapping resource="com/saftsale/test/TopProductsDeputy.hbm.xml" />
<mapping resource="com/saftsale/test/TopProducts.hbm.xml" />
在DAO中这样写 (注意Select * from是错误的,必须写出你要查询的字段名称 .
注意 from TopProducts 不是表名而是HBM中的名字,搜索的字段也是一样全部以bean中的字段为准)
public List getProductsMenuSub(String classCode,String WEBNAME)
{
log.debug("getProductsMenuSub");
try
{
String queryString = "select a.productsName from TopProducts as a, TopProductsDeputy as b where a.productsId = b.productsId and b.productsClass = '"+ classCode +"' and b.productsWebSite = '"+ WEBNAME+"'";
Query queryObject = getSession().createQuery(queryString);
return queryObject.list();
}
catch (RuntimeException re)
{
log.error("getProductsMenuSub have error", re);
throw re;
}
}
- zxzyss2014-03-03看过了,还不错,可以运行的,如果有再复杂的就更好了
- 静茹鱼2014-09-01可以运行,只是比较简单,而且我也没用到,不过还不错。
- 粉丝: 0
- 资源: 35
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助