sqlRestriction()的理解

在Criteria查询中

使用sqlRestriction()方法来提供SQL语法作限定查询,作为where字句
查看官方给的例子,如下

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}当成了通配符

最新文章

  1. [Leetcode] Maximum Gap
  2. solr 4.6配置正解
  3. EasyUI实战经验总结,给有需要的人
  4. 进程间通信的WM_COPYDATA的使用
  5. Codeforces Round #355 (Div. 2)
  6. 我的新顶级域名vell001.ml
  7. BZOJ 3575 道路堵塞
  8. &lt;.net&gt;委托初探
  9. js获取中英文长度
  10. C++的精髓——虚函数
  11. JavaScript连等赋值
  12. 自主学习之RxSwift(二) -----flatMap
  13. Docker常见仓库Node.js
  14. windows下安装mysql-5.7.11-winx64
  15. rocketMQ安装中遇到的坑
  16. MySQL完整教程(共8章)
  17. SQL:Oracle 目录
  18. Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux【转】
  19. HAproxy 代理技术原理探究
  20. border使用小技巧

热门文章

  1. 使用HTTP方式远程连接PowerShell
  2. 证明你是你——快速开启Windows Azure多重身份验证
  3. POJ3463Sightseeing[次短路计数]
  4. Unity热门插件推荐
  5. Linux字符设备驱动解析
  6. 渗透攻防工具篇-后渗透阶段的Meterpreter
  7. swift约束框架SnapKit使用
  8. Centos6 修改max user processes limits
  9. Delphi连接Oracle控件ODAC的安装及使用(轉載)
  10. Validation failed for one or more entities. See &#39;EntityValidationErrors&#39; property for more details.