Criteria查询之sqlRestriction()的理解
sqlRestriction()的理解
在Criteria查询中
List cats = sess.createCriteria(Cat.class) .add( Restrictions.sqlRestriction("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) ).list();
直接拿着官方的代码试了下,报错,点进去看了看源代码,如下
/** * Create a restriction expressed in SQL with one JDBC parameter. Any occurrences of <tt>{alias}</tt> will be * replaced by the table alias. * * @param sql The SQL restriction * @param value The parameter value * @param type The parameter type * * @return The Criterion * * @see SQLCriterion */ public static Criterion sqlRestriction(String sql, Object value, Type type) { return new SQLCriterion( sql, value, type ); }
第一个是参数String类型,是SQL语句的条件部分,第二个参数是参数值,第三个参数是类型
根据案例和源代码,可以推断出{alias}.name中{alias}是表的别名,我用的是user表,于是根据理解,这样写了下,如下
Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.sqlRestriction(“lower({User}.name ) LIKE lower(?)", "cater%", Hibernate.STRING));
结果还是报错,把Hibernate设置成自动打印出sql语句后,sql如下
Hibernate: select this_.id as id0_0_, this_.age as age0_0_, this_.birth as birth0_0_, this_.name as name0_0_ from user this_ where lower(this_).name like lower(?)
可以看到lower也被打印了出来,而且Hibernate会自动给别起别名,所以下面的形式,别名也对应不上
{User}.name LIKE ?
于是抱着试一试的态度,改成了这样:
Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.sqlRestriction(“{alias}.name LIKE lower(?)", "cater%", Hibernate.STRING));
这次对了,打印的sql为
Hibernate: select this_.id as id0_0_, this_.age as age0_0_, this_.birth as birth0_0_, this_.name as name0_0_ from user this_ where this_.name like ?
看来那里还必须写成{alias},那alias究竟是什么意思呢?是别名的意思,我的理解是,hibernate把{alias}当成了通配符
Criteria查询之sqlRestriction()的理解的更多相关文章
- JPA criteria 查询:类型安全与面向对象
参考:https://my.oschina.net/zhaoqian/blog/133500 一.JPA元模型概念,及使用 在JPA中,标准查询是以元模型的概念为基础的.元模型是为具体持久化单元的受管 ...
- Hibernate(十二)Criteria查询
一.简述 Criteria是一种比hql更面向对象的查询方式.Criteria 可使用 Criterion 和 Projection 设置查询条件.可以设置 FetchMode(联合查询抓取的模式 ) ...
- JPA 使用 Specification 复杂查询和 Criteria 查询
转自:https://blog.wuwii.com/jpa-specification.html 前言 JPA 给我们提供了基础的 CURD 的功能,并且用起来也是特别的方便,基本都是一行代码完成各种 ...
- Nhibernate系列学习之(三) Criteria查询表达式增删改查
Criteria查询表达式: 正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制. Restrict ...
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...
- NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)
摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...
- Criteria查询初学者的采纳点哦
一.Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 from Emp e group by e.dept.deptName 2.OID检索 ...
- Criteria查询数据
Criteria介绍: Criteria查询是Hibernate提供的一种查询方式,与HQL基于字符串的查询形式完全不同.Hibernate提供了org.hiberanee.Criteria 接口.o ...
- Hibernate框架之Criteria查询
首先给大家说说Hibernate检索方式 Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQ ...
随机推荐
- sqlserver 用 RowNumber 分组
SELECT RECORD.[RECORD_ID] ,RECORD.[WORKFLOW_INFO_ID] ,RECORD.[FORM_CODE] ,RECORD.[APPLY_DATE] ,RECOR ...
- OpenStack 企业私有云的若干需求(7):电信行业解决方案 NFV
自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云(Hybrid cloud)支持 主流硬件支持.云快速交付 ...
- 设置SecureCRT配色和解决乱码问题
SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单的说是Windows下登录UNIX或Linux服务器主机的软件. 一.配色 第一步: Options => Sessi ...
- 扫描线+堆 codevs 2995 楼房
2995 楼房 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 地平线(x轴)上有n个矩(lou)形(fan ...
- Codeforces Round #285 (Div.1 B & Div.2 D) Misha and Permutations Summation --二分+树状数组
题意:给出两个排列,求出每个排列在全排列的排行,相加,模上n!(全排列个数)得出一个数k,求出排行为k的排列. 解法:首先要得出定位方法,即知道某个排列是第几个排列.比如 (0, 1, 2), (0, ...
- VS的快捷键F12改成和ECLIPSE一样用ctrl+点击下载线
安装resharper 插件即可 不过这个插件是收费的,可免费体验30天
- SQL存储过程、视图
存储过程: 存储过程(stored procedure)有时也称为sproc.存储过程存储于数据库中而不是在单独的文件中,有输入参数.输出参数以及返回值等. 在数据库中,创建存储过程和创建其他对象的过 ...
- 已Access为支持,书写一个C#写入的记录的方案
/// <summary> /// 读取Excel文档 /// </summary> /// <param name="Path">文件名称 ...
- SQL80001: Incorrect syntax near ':'
原文连接:http://geekswithblogs.net/tonyt/archive/2010/03/05/138363.aspx SQL80001: Incorrect syntax nea ...
- Linux socket多进程服务器框架二
客户端未解决Bug:子进程或者父进程退出的时候,我无法做到两个进程都调用clt_socket_Destory()方式释放socket句柄, 但是进程退出后,相应的资源也会释放,有一定影响,但是不大,以 ...