直接进入正题

假设有一个实体类

/**

* 产品分类

*/

public class ProductType{

  @Id

  private String no;//编号

  private String name;//名称

}

/**

* 产品

*/

public class Product{

  @Id

  private String no;//编号

  private String name;//名称

  private ProductType productType;

  //...省略setter和getter方法

}

假设:ProductType 有如下数据:

no  name

1    产品分类1

2    产品分类2

3   产品分类3

假设:Product 有如下数据:

no  name   productTypeNo

1000  产品一     1  

1001  产品一     1

1003  产品二     2

1004  产品二       2

1005  产品三     3

使用场景:需要产品编号按连号显示:

1000-1002   产品一   产品分类1

1003-1004   产品二   产品分类2

1005-1005   产品三   产品分类3

以下是Criteria查询实现

Criteria criteria = session.createCriteria(Product.class,"p");

ProjectionList plist = Projections.projectionList();

plist.add(Projections.sqlProjection("min(no) || '-' || max(no)",new String[]{"no"},new Type[]{StringType.INSTANCE}))

  .add(Projections.groupProperty("name"))

  .add(Projections.groupProperty("ptype.name").as("productTypeName"));

criteria.setProjection(plist);

criteria.list();

注意事项如下:

1、由于需要获取productType中的属性,也就是需要联合查询,所以必须执行criteria查询是必须指定criteria.createAlias("productType","ptype");

2、由于执行SQL语句,而该查询中两个实体中都含有相同的属性no,所以必须指定no所属实例,上面红色部分必须更改为"min({alias}.no) || '-' || max({alias}.no)"

程序最终实现应该如下:

Criteria criteria = session.createCriteria(Product.class,"p");

ProjectionList plist = Projections.projectionList();

criteria.createAlias("productType","ptype");

plist.add(Projections.sqlProjection("min({alias}.no) || '-' || max({alias}.no)",new String[]{"no"},new Type[]{StringType.INSTANCE}))

  .add(Projections.groupProperty("name"))

  .add(Projections.groupProperty("ptype.name").as("productTypeName"));

criteria.setProjection(plist);

criteria.list();

总结:

1、Criteria 查询,需要获取非关联字段信息时,必须创建关联表criteria.createAlias("productType","ptype");

2、Criteria 查询,主表和关联表有相同数据库字段,且需要使用原始SQL语句时,必须指定别名,否则将无法找到指定列,而报“未明确指定列”的错误

min({alias}.no) || '-' || max({alias}.no)中{alias}会在运行时由Hibernate自动指定。

Hibernate criteria 混合sql语句多表关联时查询注意事项的更多相关文章

  1. Hibernate使用原生SQL语句进行无关联多表查询

    背景:有两个表:CpCg与CpGg需要进行多表查询 因为CpGg表设计到与另外的表也有联系,因此师兄没有关联此两个表,只是用字段进行逻辑关联,CpGg表的cp字段与CpCg表的id字段逻辑关联

  2. sql语句 两表关联查询计算数量

    select sum(a1.`num`)   from `order_orderlistrow` as a1 INNER JOIN `order_orderlist` as a2 on a1.`ord ...

  3. 记录一下sql两个表关联的查询使用方法

    SELECT * FROM t_yymp_user_info where user_id = (select b.user_id from t_yymp_auth_role as a,t_yymp_a ...

  4. hibernate的基础学习--多表关联数据查询

    Hibernate共提供4种多表关联数据查询方式 OID数据查询+OGN数据查询方式 HQL数据查询方式 QBC数据查询方式 本地SQL查询方式(hibernate很少用) 1.OID数据查询+OGN ...

  5. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  6. hibernate中使用sql语句进行表链接查询,对结果集的遍历方法

    今天做了一个在hibernate中使用sql语句进行表链接查询的功能,得到的属性是来自两个表中的字段.下面对结果集遍历的方法进行记录. sql语句不写了.部分代码如下: List<Course_ ...

  7. SQL语句 在一个表中插入新字段

    SQL语句 在一个表中插入新字段: alter table 表名 add 字段名 字段类型 例: alter table OpenCourses add Audio varchar(50)alter ...

  8. 5-04用Sql语句创建表

    用Sql语句创建表的基本语法: USE E_Market--指向当前所操作的数据库 GO CREATE TABLE CommoditySort--创建表的名字 { sortID int IDENTIT ...

  9. 出错场景是升级oracle驱动,将版本从ojdbc14升级到ojdbc6,hibernate执行原生态sql语句会报如下错误

    出错场景是升级oracle驱动,将版本从ojdbc14升级到ojdbc6,hibernate执行原生态sql语句会报如下错误:org.hibernate.MappingException: No Di ...

随机推荐

  1. svn强制添加注释脚本

    @echo off setlocal set SVN_BINDIR=C:/Program Files/VisualSVN Server/bin/ set REPOS=%1 set TXN=%2 rem ...

  2. JavaScript经典面试题系列

    1.javascript的typeof返回哪些数据类型 Object number function boolean underfind 2.例举3种强制类型转换和2种隐式类型转换? 强制(parse ...

  3. php中文编码

    header("Content-type: text/html; charset=utf-8"); header('Location: http://www.example.com ...

  4. 用vld分析C++内存泄漏

    最近发现项目里有内存泄漏,到网上搜了一些资料,决定用vld来分析解决这个问题. 直接在vs里的"工具和扩展"中搜索vld,然后下载安装就可以了. 我下载下来的是个exe文件,安装在 ...

  5. Castle ActiveRecord配置中需要注意的地方

    关于Castle 的开发可参考李会军老师的Castle 开发系列文章,里面有关于ActiveRecord学习实践系列和Castle IOC容器系列两个部分,是比较好的教程. 这里主要说明在Castle ...

  6. WCF Rest Json

    1.定义ServiceContract及实现 [ServiceContract] public interface IMemberService { [OperationContract] strin ...

  7. Ubuntu 12.04如何从登录界面登录root

    root登录,可以使我们拥有管理系统最高的权限,但是随之带来的也是,系统的安全得不到足够的保障.Ubuntu官方资料说不推荐我们以root方式登录到系统中,但是如果我们真想这么做,也是可以的. 不同版 ...

  8. 用powerdesigner建模工具生成数据库

    1,使用powerdesignerP:主键 F:外键 M:是否可为空 2,两张表建立主外键关系时,主外键名称要相同.比如A表 A_id name  说明id(P) B表 B_id name  说明id ...

  9. 使用ajax传递及接收数据

    前端代码: <input id="txtNum1" name="txtNum1" type="text" width="13 ...

  10. docker安装caffe

    [最近一直想要学习caffe,但是苦苦纠结于环境安装不上,真的是第一步都迈不出去,还好有docker的存在!下面,对本人如何利用docker安装caffe做以简单叙述,不属于教程,只是记录自己都做了什 ...