1、Hibernate查询Hibernate的查询语言:1. Native SQL: 本地语言(数据库自己的SQL语句)功能强大,2. HQL Hibernate Query Language(更灵活,推荐) 条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象.3. QBC(Query By Criteria) 查询方式这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections.Hibernate Query Language:HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,
2、而不进行update,delete和insert等操作。而且HQL是面向对象的,具备继承,多态和关联等特性。from子句:from子句是最简单的HQL,例如from Student,也可以写成 select s from Student s。它简单的返回Student类的所有实例。Query query=session.createQuery( from Course);List list=query.list(); for (Course c : list) System.out.println(c.getName(); 值得注意的是除了JAVA类和属性的名称外,HQL语句对大小写不敏感。s
3、elect子句:有时并不需要取得对象的所有属性,这时可以使用select子句进行属性查询,如select s.name from Student sQuery query=session.createQuery(select c.name from Course c);带where条件的查询:where子句:HQL也支持子查询,它通过where子句实现这一机制。where子句可以让用户缩小要返回的实例的列表范围。例如下面语句会返回所有名字为Bill的Student实例:Query query = session.createQuery(from Student as s where s.nam
4、e=Bill);where子句允许出现的表达式包括了SQL中可以使用的大多数情况。数学操作:+,-,*,/真假比较操作:=, =, =, , !=, like逻辑操作:and ,or, not字符串连接:|Query query=session.createQuery( from Course where name =武术);排序:order by查询返回列表可以按照任何返回的类或者组件的属性排序from Student s order by s.name asc/desc连接查询与SQL一样,HQL也支持连接查询,如内连接,外连接和交叉连接:inner join:内连接left outer
5、join:左外连接right outer join:右外连接full join:全连接,但不常用/sql写 select . From 表1 inner join 表2 on 表1.列=表2.列Queryquery=session.createQuery(fromGroupgjoing.students);String hql = from Book b left join b.bookType;注意join 后写一个的前面实体类别名.属性名Query query=session.createQuery( from Course c join c.students);可以使用冒号(:),作为占
6、位符,来接受参数使用。如下(链式编程)Query query=session.createQuery( from 类名 h where h.hid:id).setInteger(id,1);可以使用?作为占位符. Query query = session.createQuery( from 类名 h where h.hid?); /注意这里的索引值query.setInteger(0, 1);分页:Query query = session.createQuery( from Husband h order by h.hid desc); /从第几条开始显示,从0开始 query.setFi
7、rstResult(0); /每页显示的最大记录数 query.setMaxResults(3);模糊查询如何实现?带参数的sql如何实现?String name=小; Query query = session.createQuery( from 类名 h where h.name like ?); /注意这里的索引值 query.setString(0, %+name+%);其他模糊查询的写法:is null /is not null / between . and /in(.)了解Query q = session.createQuery(select max(m.id), min(m.
8、id), avg(m.id), sum(m.id) from 类名 m); Object o = (Object)q.uniqueResult(); System.out.println(o0 + - + o1 + - + o2 + - + o3);如果对HQL不喜欢,也不习惯可以使用SQL的检索方法:String sql= select * from book where id=? and name=? ; /2 创建一个query对象 Query query=session.createSQLQuery(sql); query.setString(0, 1); query.setStrin
9、g(1, 天龙侠侣); /3 调用query对象的方法 List list=query.list(); Iterator itor=list.iterator(); while(itor.hasNext() Object obj=(Object )itor.next(); System.out.println(obj0+ , +obj1+, + obj2); Criteria Query方式Hibernate支持Criteria查询,这种查询方式把查询条件封装为一个Criteria对象。在实际应用中,可以使用Session的createCriteria()方法构建一个org.hibernate
10、.Criteria实例,然后把具体的查询条件通过Criteria的add方法加入到Criteria实例中。Criteria是一种比hql更面向对象的查询方式。Criteria 可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式,Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式)Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来添加查询条件。Criter
11、ion 接口的主要实现包括: Example 、 Junction 和 SimpleExpression 。而Junction 的实际使用是它的两个子类 conjunction 和 disjunction ,分别是使用 AND 和 OR 操作符进行来联结查询条件集合。Criterion 的实例可以通过 Restrictions 工具类来创建,Restrictions 提供了大量的静态方法,如 eq (等于)、 ge (大于等于)、 between 等来方法的创建 Criterion 查询条件(SimpleExpression 实例)。除此之外, Restrictions 还提供了方法来创建 c
12、onjunction 和disjunction 实例,通过往该实例的 add(Criteria) 方法来增加查询条件形成一个查询条件集合。创建一个Criteria 实例org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);List cats = crit.list();限制内容限制结果集内容一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例
13、。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。List cats = sess.createCriteria(Cat.class).add( Restrictions.like(name, Fritz%) ).add( Restrictions.between(weight, minWeight, maxWeight) ).list();约束可以按逻辑分组。List cats = sess.createCriteria(Cat.class).add( Restrictions.like(name, Fritz%
14、) ).add( Restrictions.or(Restrictions.eq( age, new Integer(0) ),Restrictions.isNull(age) ).list();List cats = sess.createCriteria(Cat.class).add( Restrictions. in( name, new String Fritz, Izi, Pk ) ).add( Restrictions.disjunction().add( Restrictions.isNull(age) ).add( Restrictions.eq(age, new Intege
15、r(0) ) ).add( Restrictions.eq(age, new Integer(1) ) ).add( Restrictions.eq(age, new Integer(2) ) ) ).list();Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。List cats = sess.createCriteria(Cat.class).add( Restrictions.sql(lower(alias.name) like lower(?), Fritz%,Hibernate.STRING)
16、).list();alias占位符应当被替换为被查询实体的列别名。Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。Property age = Property.forName(age);List cats = sess.createCriteria(Cat.class).add( Restrictions.disjunction().add( age.isNull() ).add( age.eq( new Integer(0) ) ).add( age.eq( new Integer(1) ) ).add( ag
17、e.eq( new Integer(2) ) ) ).add( Property.forName(name).in( new String Fritz, Izi, Pk ) ).list();结果集排序可以使用org.hibernate.criterion.Order来为查询结果排序。List cats = sess.createCriteria(Cat.class).add( Restrictions.like(name, F%).addOrder( Order.asc(name) ).addOrder( Order.desc(age) ).setMaxResults(50).list();
18、List cats = sess.createCriteria(Cat.class).add( Property.forName(name).like(F%) ).addOrder( Property.forName(name).asc() ).addOrder( Property.forName(age).desc() ).setMaxResults(50).list();关联你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。List cats = sess.createCriteria(Cat.class).add( Restrictions.like(na
19、me, F%).createCriteria(kittens).add( Restrictions.like(name, F%).list();注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。接下来,替换形态在某些情况下也是很有用的。List cats = sess.createCriteria(Cat.class).createAlias(kittens, kt).createAlias(mate, mt).add( Restrictions.eqProperty(kt. name, mt. name) ).list()
20、;(createAlias()并不创建一个新的 Criteria实例。)Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens, 你必须使用returnMaps()。List cats = sess.createCriteria(Cat.class).createCriteria(kittens, kt).add( Restrictions.eq(name, F%) ).returnMaps().list();Iterator iter = cats.iterator();while ( iter.hasNext() ) Map
21、 map = (Map) iter.next();Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);Cat kitten = (Cat) map.get(kt);动态关联抓取你可以使用setFetchMode()在运行时定义动态关联抓取的语义。List cats = sess.createCriteria(Cat.class).add( Restrictions.like(name, Fritz%) ).setFetchMode(mate, FetchMode.EAGER).setFetchMode(kittens, FetchMode.EAGER).l
22、ist();这个查询可以通过外连接抓取mate和kittens。查询示例org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。Cat cat = new Cat();cat.setSex(F);cat.setColor(Color.BLACK);List results = session.createCriteria(Cat.class).add( Example.create(cat) ).list();版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。可以自行调整Example使之更实用。Example example
23、 = Example.create(cat).excludeZeroes() /exclude zero valued properties.excludeProperty(color) /exclude the property named color.ignoreCase() /perform case insensitive string comparisons.enableLike(); /use like for string comparisonsList results = session.createCriteria(Cat.class).add(example).list()
24、;甚至可以使用examples在关联对象上放置条件。List results = session.createCriteria(Cat.class).add( Example.create(cat) ).createCriteria(mate).add( Example.create( cat.getMate() ) ).list();投影聚合分组org.hibernate.criterion.Projections是 Projection 的实例工厂。通过调用 setProjection()应用投影到一个查询。List results = session.createCriteria(Cat
25、.class).setProjection( Projections.rowCount() ).add( Restrictions.eq(color, Color.BLACK) ).list();List results = session.createCriteria(Cat.class).setProjection( Projections.projectionList().add( Projections.rowCount() ).add( Projections.avg(weight) ).add( Projections.max(weight) ).add( Projections.
26、groupProperty(color) ).list();在一个条件查询中没有必要显式的使用 group by 。某些投影类型就是被定义为 分组投影,他们也出现在SQL的group by子句中。可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。实现方式:List results = session.createCriteria(Cat.class).setProjection( Projections.alias( Projections.groupProperty(color), colr ) ).addOrder( Order.asc(colr) ).list();?
27、List results = session.createCriteria(Cat.class).setProjection( Projections.groupProperty(color).as(colr) ).addOrder( Order.asc(colr) ).list();alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,当添加一个投影到一个投影列表中时 你可以为它指定一个别名:List results = session.createCriteria(Cat.class).setProjection( Projection
28、s.projectionList().add( Projections.rowCount(), catCountByColor ).add( Projections.avg(weight), avgWeight ).add( Projections.max(weight), maxWeight ).add( Projections.groupProperty(color), color ).addOrder( Order.desc(catCountByColor) ).addOrder( Order.desc(avgWeight) ).list();List results = session
29、.createCriteria(Domestic.class, cat).createAlias(kittens, kit).setProjection( Projections.projectionList().add( Projections.property(cat. name), catName ).add( Projections.property(kit. name), kitName ).addOrder( Order.asc(catName) ).addOrder( Order.asc(kitName) ).list();也可以使用Property.forName()来表示投影
30、:List results = session.createCriteria(Cat.class).setProjection( Property.forName(name) ).add( Property.forName(color).eq(Color.BLACK) ).list();List results = session.createCriteria(Cat.class).setProjection( Projections.projectionList().add( Projections.rowCount().as(catCountByColor) ).add( Property.forName(weight).avg().as(avgWeight) ).add( Property.forName(weight).
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1