Hibernate的查询 标准(Criteria)查询

编程技术  /  houtizong 发布于 3年前   166

一个简单例子:

@SuppressWarnings("unchecked")public void searchByPropertys() {Session session = this.getSession();Criteria crit = session.createCriteria(Conft.class);List<Conft> list = crit.list();for(Conft c : list){System.out.println(c.getId());}}

 

标准查询API最终仍然翻译为SQL交由数据库处理,返回java.util.List对象

 

怎么增加条件呢?请看如下代码:

public void searchByPropertys() {Session session = this.getSession();Criteria crit = session.createCriteria(Conft.class);crit.add(Restrictions.eq("id", 2)); // =crit.add(Restrictions.ne("id", 2)); // !=crit.add(Restrictions.lt("id", 2)); // <crit.add(Restrictions.gt("id", 2)); // >crit.add(Restrictions.le("id", 2)); // <=crit.add(Restrictions.ge("id", 2)); // >=crit.add(Restrictions.in("id", new String[]{"2"})); // incrit.add(Restrictions.like("id", "%2%")); // likecrit.add(Restrictions.like("id", "2",MatchMode.ANYWHERE)); // %x%crit.add(Restrictions.like("id", "2",MatchMode.START)); // x%crit.add(Restrictions.like("id", "2",MatchMode.END)); // %xcrit.add(Restrictions.like("id", "2",MatchMode.EXACT)); // xList<Conft> list = crit.list();for(Conft c : list){System.out.println(c.getId());}}

 

代码后面写出了增加条件的方式和意思。

 

如果有and或者是or的关系的话,可以使用Conjunction(AND)和Disjunction(OR)!

下面是一个使用示例:

public void searchByPropertys() {Session session = this.getSession();Criteria crit = session.createCriteria(Conft.class);// 创建条件Criterion a = Restrictions.gt("id", 2); // >Criterion b = Restrictions.lt("id", 2); // <Criterion c = Restrictions.like("id", "2",MatchMode.ANYWHERE);// and 关系Conjunction conjunction = Restrictions.conjunction();conjunction.add(a);conjunction.add(b);// or 关系Disjunction disjunction = Restrictions.disjunction();disjunction.add(conjunction);disjunction.add(c);// 增加查询条件crit.add(disjunction);List<Conft> list = crit.list();for(Conft conft : list){System.out.println(conft.getId());}}

 

a和b是AND关系,而a和b合起来作为条件后和c是OR关系!

如果看他的SQL的话,是这样的,有助于理解:

(where (a>? and b<?) or c like ?)

 

除此之外还可以使用sqlRestriction方法直接拼接SQL

public User getUserById(int pk){Session session = this.getSession();Criteria crit = session.createCriteria(User.class);crit.add(Restrictions.sqlRestriction(" {alias}.id=2 "));List<User> list = crit.list();return (User)list.get(0);}

 

注意{alias}是表的名称,这个不用修改,Hibernate在生成SQL时会自动替换!

在源码中可以看到:

public static Criterion sqlRestriction(String sql, Object values[], Type types[]){    return new SQLCriterion(sql, values, types);}public static Criterion sqlRestriction(String sql, Object value, Type type){    return new SQLCriterion(sql, new Object[] {        value    }, new Type[] {        type    });}public static Criterion sqlRestriction(String sql){    return new SQLCriterion(sql, ArrayHelper.EMPTY_OBJECT_ARRAY, ArrayHelper.EMPTY_TYPE_ARRAY);}

 

也就是说这个方法有三个调用方式,直接写SQL,如果你的SQL中有 ? 作为占位符,那么可设置后面两个参数,第二个参数对应 ? ,第三个是参数字段的类型!

如果有多个 ? ,那么第二和第三个参数就要用数组的形式来传递!

 

请您到ITEYE看我的原创:http://cuisuqiang.iteye.com

或支持我的个人博客,地址:http://www.javacui.com

 

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客