Hibernate criteria 混合sql语句多表关联时查询注意事项
直接进入正题
假设有一个实体类
/**
* 产品分类
*/
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语句多表关联时查询注意事项的更多相关文章
- Hibernate使用原生SQL语句进行无关联多表查询
背景:有两个表:CpCg与CpGg需要进行多表查询 因为CpGg表设计到与另外的表也有联系,因此师兄没有关联此两个表,只是用字段进行逻辑关联,CpGg表的cp字段与CpCg表的id字段逻辑关联
- sql语句 两表关联查询计算数量
select sum(a1.`num`) from `order_orderlistrow` as a1 INNER JOIN `order_orderlist` as a2 on a1.`ord ...
- 记录一下sql两个表关联的查询使用方法
SELECT * FROM t_yymp_user_info where user_id = (select b.user_id from t_yymp_auth_role as a,t_yymp_a ...
- hibernate的基础学习--多表关联数据查询
Hibernate共提供4种多表关联数据查询方式 OID数据查询+OGN数据查询方式 HQL数据查询方式 QBC数据查询方式 本地SQL查询方式(hibernate很少用) 1.OID数据查询+OGN ...
- java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)
1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...
- hibernate中使用sql语句进行表链接查询,对结果集的遍历方法
今天做了一个在hibernate中使用sql语句进行表链接查询的功能,得到的属性是来自两个表中的字段.下面对结果集遍历的方法进行记录. sql语句不写了.部分代码如下: List<Course_ ...
- SQL语句 在一个表中插入新字段
SQL语句 在一个表中插入新字段: alter table 表名 add 字段名 字段类型 例: alter table OpenCourses add Audio varchar(50)alter ...
- 5-04用Sql语句创建表
用Sql语句创建表的基本语法: USE E_Market--指向当前所操作的数据库 GO CREATE TABLE CommoditySort--创建表的名字 { sortID int IDENTIT ...
- 出错场景是升级oracle驱动,将版本从ojdbc14升级到ojdbc6,hibernate执行原生态sql语句会报如下错误
出错场景是升级oracle驱动,将版本从ojdbc14升级到ojdbc6,hibernate执行原生态sql语句会报如下错误:org.hibernate.MappingException: No Di ...
随机推荐
- 【转】Java编程之字符集问题研究
发现这是对字集说得最明了的一篇文章了. 转发自:http://tomcat-oracle.iteye.com/blog/2037160 1. 概述 本文主要包括以下几个方面:编码基本知识,java,系 ...
- ubuntu svn安装测试
本机环境 :ubuntu 12.4 LTS desktop 1 sudo apt-get install subversion #安装svn 2 sudo mkdir /home/lzj/s ...
- input file 模拟预览图片。
首先申明,接下来内容只是单纯的预览图片,最多选择九张,并没有和后台交互,交互的话需要自己另外写js. 本来想写一个调用摄像头的demo,意外的发现input file 在手机端打开的话,ios可以调用 ...
- 网站前端优化 -saveForSelf
九.网站前端优化 – IMG 9.1.可以优化的图片 图片总共可以分为两类,一个是CSS IMAGES,另一个是产品图片. 9.2.CSS IMAGES CSS图片现在采用的方式是图片合并的方式,这样 ...
- CSS 常用命名
在前端开发中,规范使用 DIV+CSS 命名,可以增强团队合作提高开发效率,有利于页面后期的维护和优化. 1.页面结构 wrap:外套.包裹,用于最外层. wrapper:外套,用于页面外围控制整体布 ...
- 『奇葩问题集锦』function * (next){ 执行报错 SyntaxError: Unexpected token *
这是因为 app.use(function * (){ 语句中有一个 * ,这种方式被称为generator functions ,一般写作function *(){...} 的形式,在此类func ...
- 强大的字符串格式化函数 - format
自python2.6开始,新增了一种格式化字符串的函数str.format(),它通过{}和:来代替% 位置方法格式化 >>>'{}-{}'.format('simon','ting ...
- yii2源码学习笔记(十)
继续了解Application. /** * Registers the errorHandler component as a PHP error handler. * 注册errorHandler ...
- php 需熟练掌握的几个函数
class Test { } $obj = new Test; 一.__construct() {} 构造函数 二.__destroy() {} 析构函数 三.__get() {} 试图读取一个并不 ...
- 一个简单的makefile,一次性编译本文件夹下所有的cpp文件
代码: CXX := g++ CFLAGS := -g TARGET := xxx.exe SRCS := $(wildcard *.cpp) OBJS := $(patsubst %cpp,%o,$ ...