一个简单例子:
@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"})); // in crit.add(Restrictions.like("id", "%2%")); // like crit.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)); // %x crit.add(Restrictions.like("id", "2",MatchMode.EXACT)); // x List<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