Hibernate的查询 标准(Criteria)查询
2013-02-01 12:31
357 查看
一个简单例子:
Java代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
@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代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
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代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
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代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
(where (a>? and b<?) or c like ?)
除此之外还可以使用sqlRestriction方法直接拼接SQL
Java代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
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代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
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中有 ? 作为占位符,那么可设置后面两个参数,第二个参数对应 ? ,第三个是参数字段的类型!
如果有多个 ? ,那么第二和第三个参数就要用数组的形式来传递!
Java代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
@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代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
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代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
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代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
(where (a>? and b<?) or c like ?)
除此之外还可以使用sqlRestriction方法直接拼接SQL
Java代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
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代码
![](http://cuisuqiang.iteye.com/images/icon_star.png)
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中有 ? 作为占位符,那么可设置后面两个参数,第二个参数对应 ? ,第三个是参数字段的类型!
如果有多个 ? ,那么第二和第三个参数就要用数组的形式来传递!
相关文章推荐
- Hibernate的查询 标准(Criteria)查询 聚合和分组
- Hibernate的查询 标准(Criteria--Projections)查询----- 聚合和分组
- Hibernate的查询 标准(Criteria)查询 聚合和分组
- Hibernate的查询 标准(Criteria)查询 分页、单个记录、排序
- (3) Hibernate的查询 标准(Criteria)查询
- Hibernate的查询 标准(Criteria)查询 分页、单个记录、排序
- Hibernate的查询 标准(Criteria)查询 聚合和分组
- Hibernate的查询 标准(Criteria)查询 分页、单个记录、排序
- Hibernate的查询 标准(Criteria)查询 聚合和分组
- Hibernate的查询 标准(Criteria)查询
- Hibernate的查询 标准(Criteria)查询
- Hibernate的查询 标准(Criteria)查询 分页、单个记录、排序
- hibernate Criteria查询 2.3
- Hibernate使用Criteria实现查询
- Hibernate的学习之路十八(Criteria的查询简单)
- Hibernate中,利用Criteria查询容器实现sql的写法
- hibernate-criteria查询(二)
- Hibernate中使用Criteria查询及注解——(Emp.java)
- Hibernate的 SessionFactory,Configuration,Query ,Criteria接口简介,及Query的查询方法
- Hibernate-Criteria查询(2)动态查询、排序、分页、连接查询、投影查询、聚合函数