Restrictions.sqlRestriction 能编程 直接支持sql语句用sql语句么

hibernate criteria中Restrictions的用法 - 李高松 - ITeye技术网站
博客分类:
Restrictions.eq
Restrictions.allEq
利用Map来进行多个等于的限制
Restrictions.gt
Restrictions.ge
Restrictions.lt
Restrictions.le
Restrictions.between
Restrictions.like
Restrictions.in
Restrictions.and
Restrictions.or
Restrictions.sqlRestriction
用SQL限定查询
2,QBC常用限定方法
Restrictions.eq --& equal,等于.
Restrictions.allEq --& 参数为Map对象,使用key/value进行多个等于的比对,相当于多个Restrictions.eq的效果
Restrictions.gt --& great-than & 大于
Restrictions.ge --& great-equal &= 大于等于
Restrictions.lt --& less-than, & 小于
Restrictions.le --& less-equal &= 小于等于
Restrictions.between --& 对应SQL的between子句
Restrictions.like --& 对应SQL的LIKE子句
Restrictions.in --& 对应SQL的in子句
Restrictions.and --& and 关系
Restrictions.or --& or 关系
Restrictions.isNull --& 判断属性是否为空,为空则返回true
Restrictions.isNotNull --& 与isNull相反
Restrictions.sqlRestriction --& SQL限定的查询
Order.asc --& 根据传入的字段进行升序排序
Order.desc --& 根据传入的字段进行降序排序
MatchMode.EXACT --& 字符串精确匹配.相当于"like 'value'"
MatchMode.ANYWHERE --& 字符串在中间匹配.相当于"like '%value%'"
MatchMode.START --& 字符串在最前面的位置.相当于"like 'value%'"
MatchMode.END --& 字符串在最后面的位置.相当于"like '%value'"
查询年龄在20-30岁之间的所有学生对象
List list = session.createCriteria(Student.class)
.add(Restrictions.between("age",new Integer(20),new Integer(30)).list();
查询学生姓名在AAA,BBB,CCC之间的学生对象
String[] names = {"AAA","BBB","CCC"};
List list = session.createCriteria(Student.class)
.add(Restrictions.in("name",names)).list();
查询年龄为空的学生对象
List list = session.createCriteria(Student.class)
.add(Restrictions.isNull("age")).list();
查询年龄等于20或者年龄为空的学生对象
List list = session.createCriteria(Student.class)
.add(Restrictions.or(Restrictions.eq("age",new Integer(20)),
Restrictions.isNull("age")).list();
--------------------------------------------------------------------
使用QBC实现动态查询
public List findStudents(String name,int age){
Criteria criteria = session.createCriteria(Student.class);
if(name != null){
criteria.add(Restrictions.liek("name",name,MatchMode.ANYWHERE));
if(age != 0){
criteria.add(Restrictions.eq("age",new Integer(age)));
criteria.addOrder(Order.asc("name"));//根据名字升序排列
return criteria.list();
-----------------------------------------------------------------------------------
今天用了写hibernate高级查询时用了Restrictions(当然Expression也是可以以的)这个类.感觉不错.
下面的代码写的不易读.其实核心就是一句
Restrictions.or(Restrictions.like(),Restrictions.or(Restrictions.like,........))
里面的or可以无限加的.还是比较好用
Session session = getHibernateTemplate().getSessionFactory()
.openSession();
Criteria criteria = session.createCriteria(Film.class);
List&Film& list = criteria.add(
Restrictions.or(Restrictions.like("description", key,MatchMode.ANYWHERE),
Restrictions.or(Restrictions.like("name", key,MatchMode.ANYWHERE),
Restrictions.or(
Restrictions.like("direct", key,MatchMode.ANYWHERE),
Restrictions.or(Restrictions.like("mainplay",key,MatchMode.ANYWHERE),
Restrictions.like("filearea", key,MatchMode.ANYWHERE)))))).list();
session.close();
浏览: 262108 次
来自: 北京
PageOffice插件,挺好使得,可以试试
需要用哪些jar,可以说下吗
哈哈哈,是啊。不用解压,我傻傻的解压出来搞半天。。。
第二种方法1.拷贝features和plugins目录覆盖到/ ...Hibernate的查询 标准(Criteria)查询 - java小强 - ITeye技术网站
博客分类:
一个简单例子:
@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[] {
}, new Type[] {
public static Criterion sqlRestriction(String sql)
return new SQLCriterion(sql, ArrayHelper.EMPTY_OBJECT_ARRAY, ArrayHelper.EMPTY_TYPE_ARRAY);
也就是说这个方法有三个调用方式,直接写SQL,如果你的SQL中有 ? 作为占位符,那么可设置后面两个参数,第二个参数对应 ? ,第三个是参数字段的类型!
如果有多个 ? ,那么第二和第三个参数就要用数组的形式来传递!
请您到ITEYE看我的原创:
或支持我的个人博客,地址:
cuisuqiang
浏览: 2148967 次
来自: 北京
浏览量:1958847
请问一下前端是怎么处理的啊
挺好 成功了 谢谢
java实现操作excel文件,poi实现感觉有点麻烦。Pag ...
为什么我的都按上面复制的,也没报错就是访问不了呢hibernate 查询使用总结(一) - 研发管理当前位置:& &&&hibernate 查询使用总结(一)hibernate 查询使用总结(一)&&网友分享于:&&浏览:16次hibernate 查询应用总结(一)
今天主要总结hibernate的Criteria标准查询,Criteria(标准)查询的功能非常强大,只要sql语句能解决的他就能解决,主要包括Example(示例查询),Restrictions(限制),Projections(投影),还有aggregation(聚会),离线查询,子查询。其中重点讲解关联查询,可以通过criteria.createCriteria()方法或criteria.createAlias()方法进行关联查询。我碰到了一个非常复杂的关联查询,sql语句如下:
String sql = select cp.id from ctl_project cp left join ctl_change_info cci on cci.ctl_project_id = cp.id group by cci.ctl_project_id having sum(CHAR_LENGTH(replace(cci.change_content_type,'conf',''))& CHAR_LENGTH(cci.change_content_type)) &=0 and cp.id in(select max(id) from ctl_project cp2 group by sale_no,intby2 );
其中ctl_project和ctl_change_info是一对多的关系,实现方法有两种:
一是直接执行sql语言:getSession().createSQLQuery("上述语句").getEntity(CtlProject.Class).list()。
另一种是要重点强调的,就是在criteria的基础之上添加原始的sql语句,因为要用到left join,所以原本简单的问题有点复杂了。试用了很多种方法,
(1)createAlias("ctlChangeInfo","change").add(Restrictions.sqlRestriction("上述语句on cci.ctl_project_id = cp.id 后面部分语句")),
(2)criteria.add(Restrictions.sqlRestriction("上述语句on 后面部分语句"))等等,能想到的几乎都想到了,都没效果,加了几次班,终于在今天周五把问题解决了,能过一个轻松的周末了,真有一种说不出的喜悦和高兴,就像打了一场胜仗一样。其实很简单:cr.createAlias("ctlChangeInfos", "change").add(Restrictions.sqlRestriction("上述语句on cci.ctl_project_id = cp.id之后,group by之前");但是要在group by之前添加“1=1” ,并且要将cp改成this_,将cci改成change1_就ok了,加“1=1”是因为criteria的add方法生成了where这一关键字,所以直接加“group by”是不行的,必须是“where 1=1 group by……”要加至于为什么要改成this_和change1_,这是hibernate运用时的别名,通过查看生成的sql语句得到的。
本文书写比较混乱,没有实际的参考价值,仅作为本人的总结。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 pb 直接执行sql语句 的文章

 

随机推荐