您的位置:首页 > 其它

Hibernate的查询 标准(Criteria)查询

2013-02-01 12:31 357 查看
一个简单例子:

Java代码



@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对象



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

Java代码



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)!

下面是一个使用示例:

Java代码



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的话,是这样的,有助于理解:

Java代码



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



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

Java代码



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时会自动替换!

在源码中可以看到:

Java代码



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中有 ? 作为占位符,那么可设置后面两个参数,第二个参数对应 ? ,第三个是参数字段的类型!

如果有多个 ? ,那么第二和第三个参数就要用数组的形式来传递!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: