Hibernate中Criteria的完整用法
- 格式:doc
- 大小:69.00 KB
- 文档页数:19
criteriaquery 检索nested类型-回复CriteriaQuery是Hibernate框架中的一种查询方法,用于进行复杂的查询操作。
在本文中,我们将重点介绍如何使用CriteriaQuery来检索nested类型的数据。
第一步:了解nested类型Nested类型是一种特殊的数据类型,它允许将一个文档嵌套在另一个文档中。
在关系型数据库中,我们通常使用外键来建立文档之间的关系,而在NoSQL数据库中,使用nested类型可以更方便地表示文档之间的嵌套关系。
第二步:创建实体类和映射文件在使用CriteriaQuery检索nested类型之前,我们首先需要创建相应的实体类和映射文件。
假设我们有两个实体类:Order和Product,其中Order中包含一个名为products的nested类型的属性。
我们可以使用注解或XML文件来定义实体类和映射关系。
第三步:创建CriteriaBuilder和CriteriaQuery对象在使用CriteriaQuery之前,我们需要创建CriteriaBuilder和CriteriaQuery对象。
CriteriaBuilder是用于构建查询条件的类,而CriteriaQuery是用于构建查询语句本身的类。
javaCriteriaBuilder cb = session.getCriteriaBuilder();CriteriaQuery<Order> cq = cb.createQuery(Order.class);Root<Order> root = cq.from(Order.class);第四步:创建Join对象由于我们要检索nested类型的数据,因此需要使用Join操作来处理嵌套在Order中的products属性。
我们可以使用CriteriaQuery的join方法来创建Join对象。
javaJoin<Order, Product> productJoin = root.join("products");第五步:设置查询条件在使用CriteriaQuery进行查询之前,我们还可以设置各种查询条件。
复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如User 实体对象与Addres实体对象具有一对多的关联关系,我们可以如下构造符合查询:Criteria criteria=session.createCriteria(User.class);Criteria addcriteria=criteria.createCriteria(“addresses”);(1)addcriteria.add(Express.like(“address”,”%tianjin%”));List list=criteria.list();for(int i=0;iUser user=(User)list.get(i);System.out.println(user.getName()+”\n”);Set addresses=user.getAddresses();Iterator it=addresses.iterator();while(it.hasNext(){Address address=(Address)it.next();Syste m.out.println(address.getAddress()+”\n”);}}当执行到了(1)处时,表明要针对User对象的addresses属性添加新的查询条件,因此当执行criteria.list()时,Hibernate会生成类似如下的SQL语句:Select * from user inner join address on user.id=address.id where address.address like …%shanghai%‟;正如我们所见,我们可以通过向Criteria中添加保存关联对象的集合属性(addresses属性保存与User对象相关联的Address对象),来构造复合查询,在数据库一端是通过内连接查询来实现。
Hibernate QBC查询QBC查询:QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。
Criteria的使用总结1、目前只遇到用于单表查询(多表查询期待中。
)public Integer getqueryTamArchivesCount(String content, String fileNumber, String fileType, Date beginDate,Date endDate){DetachedCriteria criteria = DetachedCriteria.forClass(TamArch.class);if (content != null && content.trim().length() > 0) {//模糊匹配criteria.add(Restrictions.like("subject", "%" + content + "%"));}if (fileNumber != null && fileNumber.trim().length() > 0) { //相等criteria.add(Restrictions.eq("archivesNo", fileNumber));}if ("1".equals(fileType)) {//或者criteria.add(Restrictions.or(Restrictions.eq("archivesStatus", "1"), Restrictions.eq("archivesStatus", "2")));}else if("2".equals(fileType)){criteria.add(Restrictions.eq("archivesStatus", "99"));}if(beginDate!=null&&endDate!=null){//两者之间criteria.add(Restrictions.between("issueDate",beginDate,endDate));}//按日期降序排列criteria.addOrder(Order.desc("inputDate"));return archDao.getRowCount(criteria) ;}注意:①对于日期有点bug,如果查询的日期为空,则查询不到数据。
Hibernate查询sql结果⾏数、查询列表的⼏种⽅法⼀、前⾔这个东西,难度⼏乎没有,就是繁琐。
⼀条简单的select count(*) from table_name都能有多种书写⽅式。
总是忘,这⾥记录下。
⼀、通过Criteria 查询查询⾏数:Criteria criteriaCount = getCriteria();criteriaCount = criteriaCount.add(Restrictions.eq("dispatchTaskId", dispatchTaskId));criteriaCount.setProjection(Projections.rowCount());Integer totalCount = ((Long) criteriaCount.uniqueResult()).intValue();查询列表:Criteria criteria = getCriteria();criteria.add(Restrictions.eq("eventId", eventInformationId));List<EventTaskAssignment> list = criteria.list();⼆、通过原⽣sql查询查询⾏数:SQLQuery queryCount = getSession().createSQLQuery("SELECT COUNT(*) FROM incidentInformation WHERE ii.incidentInformationId = :incidentInformationId AND dti.taskstate = :taskstate");queryCount.setParameter("incidentInformationId", incidentInformationId);queryCount.setParameter("taskstate", ETaskStatus.STATUS_INIT.getStatusValue());int count = ((BigDecimal) queryCount.uniqueResult()).intValue();return count;查询列表:1、返回的item为数据库表对应poSQLQuery query = getSession().createSQLQuery(sqlQuery);query.setParameter("userId", userId);query.addEntity(EventTaskAssignment.class);List<EventTaskAssignment> items = query.list();2、返回的item为voSQLQuery query = getSession().createSQLQuery(sqlBuffer.toString());query.setParameter("eventInformationId", eventInformationId);query.addScalar("userId", StandardBasicTypes.STRING);query.addScalar("userName", StandardBasicTypes.STRING);query.setResultTransformer(Transformers.aliasToBean(UserRoles.class));List<UserRoles> list = query.list();三、通过hibernate的查询语⾔查询String countHql = "select count(*) from a where and a.approveResult = :approveResult and a.approverId = :approverId";Query countQuery = getSession().createQuery(countHql);countQuery.setParameter("approverId", approverId);int count = ((Long) countQuery.uniqueResult()).intValue();。
hibernate 中Criteria 的使用介绍要对资料库管理系统进行操作,最基本的就是使用SQL(Standard Query Language)语句,大部份的资料库都支援标准的SQL语句,然而也有一些特定于资料库的SQL语句,应用程式配合SQL 语句进行资料库查询时,若使用到特定于资料库的SQL语句,程式本身会有相依于特定资料库的问题。
使用Hibernate时,即使您不了解SQL的使用与撰写,也可以使用它所提供的API来进行SQL语句查询,org.hibernate.Criteria对SQL进行封装,您可以从Java物件的观点来组合各种查询条件,由Hibernate自动为您产生SQL语句,而不用特别管理SQL与资料库相依的问题。
以最基本的查询来说,如果您想要查询某个物件所对应的资料表中所有的内容,您可以如下进行查询:Criteria criteria = session.createCriteria(User.class);List users = criteria.list();for(Iterator it = users.iterator(); it.hasNext(); ) {User user = (User) it.next();System.out.println(user.getId() +" "t " + user.getName() +"/" + user.getAge());}Criteria建立后,若不给予任何的条件,预设是查询物件所对应表格之所有资料,如果您执行以上的程式片段,并于设定档中设定了了Hibernate的”show_sql”属性,则可以在主控下看到以下的SQL 语句之产生:Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_Criteria基本查询条件设定org.hibernate.Criteria实际上是个条件附加的容器,如果想要设定查询条件,则要使用org.hibernate.criterion.Restrictions的各种静态方法传回org.hibernate.criterion.Criteria实例,传回的每个org.hibernate.criterion.Criteria实例代表着一个条件,您要使用org.hibernate.Criteria的add()方法加入这些条件实例,例如查询”age”大于20且小于40的资料:Criteria criteria = session.createCriteria(User.class);criteria.add(Restrictions.gt("age", new Integer(20)));criteria.add(Restrictions.lt("age", new Integer(40)));List users = criteria.list();for(Iterator it = users.iterator(); it.hasNext(); ) {User user = (User) it.next();System.out.println(user.getId() +" "t " + user.getName() +"/" + user.getAge());}Restrictions的gt()方法表示大于(great than)的条件,而lt表示小于(less than)的条件,执行以上程式片段,观察所产生的SQL语句,将使用where与and子句产来完成SQL的条件查询:Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.age>? and this_.age使用add()方法加入条件时,预设是使用and来组合条件,如果要用or的方式来组合条件,则可以使用Restrictions.or()方法,例如结合age等于(eq)20或(or)age为空(isNull)的条件:Criteria criteria = session.createCriteria(User.class);criteria.add(Restrictions.or(Restrictions.eq("age", new Integer(20)),Restrictions.isNull("age")));List users = criteria.list();观察所产生的SQL语句,将使用where与or子句完成SQL的条件查询:Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=? or this_.age is null)您也可以使用Restrictions.like()方法来进行SQL中like子句的功能,例如查询”name”中名称为”just”开头的资料:Criteria criteria = session.createCriteria(User.class);criteria.add(Restrictions.like("name", "just%"));List users = criteria.list();观察所产生的SQL语句如下:Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.name like ?Restrictions的几个常用限定查询方法如下表所示:方法说明Restrictions.eq 等于Restrictions.allEq 使用Map,使用key/value进行多个等于的比对Restrictions.gt 大于>Restrictions.ge 大于等于>=Restrictions.lt 小于<Restrictions.le 小于等于<=Restrictions.between 对应SQL的BETWEEN子句Restrictions.like 对应SQL的LIKE子句Restrictions.in 对应SQL的in子句Restrictions.and and关係Restrictions.or or关係Criteria进阶查询条件设定使用Criteria进行查询时,不仅仅能组合出SQL中where子句的功能,还可以组合出如排序、统计、分组等的查询功能。
criteria对象逻辑运算查询一、引言在许多数据库应用中,我们经常需要使用查询语句来检索符合特定条件的数据。
Criteria对象是Hibernate等ORM框架提供的一种用于构建复杂查询的方法,它允许我们在实体类或映射文件中创建复杂的查询条件。
在本篇文章中,我们将介绍Criteria对象中逻辑运算查询的基本概念和用法。
二、基本逻辑运算符在Criteria对象中,我们通常使用AND、OR和NOT等逻辑运算符来组合查询条件。
这些运算符可以根据需要组合多个属性比较、集合比较、函数查询等操作符,从而构建复杂的查询语句。
以下是一些常用的逻辑运算符:* AND:表示两个条件都必须满足。
* OR:表示两个条件中至少有一个满足。
* NOT:表示否定一个条件。
三、示例查询以下是一个使用Criteria对象进行逻辑运算查询的示例:假设我们有一个User实体类,其中包含id、name和age三个属性。
我们想要查询年龄大于等于18岁且姓名包含“张”的所有用户。
```java// 创建Criteria对象Criteria criteria = session.createCriteria(User.class);// 添加条件:年龄大于等于18岁criteria.add(Property.ge("age", 18));// 添加条件:姓名包含“张”criteria.add(Property.like("name", "张%"));// 执行查询List<User> users = criteria.list();```在上述示例中,我们首先创建了一个Criteria对象,并使用add 方法添加了两个条件:年龄大于等于18岁和姓名包含“张”。
最后,我们使用list方法执行查询,并获取符合条件的User对象的列表。
四、多重条件查询在某些情况下,我们可能需要同时满足多个条件。
在Java类中,`criteria.addLike()`方法通常用于构建SQL查询语句中的模糊匹配条件。
它用于在查询中添加一个包含通配符`%`的模糊匹配条件。
`criteria.addLike()`方法的使用取决于你使用的ORM框架,因为不同的ORM框架可能有不同的API和语法。
以下是几个常见的ORM 框架中使用`criteria.addLike()`方法的示例:1. Hibernate Criteria API:```javaCriteria criteria = session.createCriteria(Employee.class);criteria.addLike(Restrictions.sqlRestriction("name like %?{%}", name, MatchMode.ANYWHERE));List<Employee> employees = criteria.list();```2. JPA Criteria API:```javaCriteriaBuilder builder = entityManager.getCriteriaBuilder();CriteriaQuery<Employee> query = builder.createQuery(Employee.class);Root<Employee> root = query.from(Employee.class);query.where(builder.like(root.get("name"), builder.concat("%", name, "%")));List<Employee> employees = entityManager.createQuery(query).getResultList();```3. MyBatis:```xml<select id="findEmployeesByName" resultType="Employee">SELECT * FROM employee WHERE name LIKE CONCAT('%', #{name}, '%')</select>```在上述示例中,`criteria.addLike()`方法用于将给定的名称(`name`)添加到查询条件中,并在名称中添加通配符`%`,以便进行模糊匹配。
hibernate 重写criteria的order排序方式在Hibernate中,要重写Criteria的排序方式,你可以使用`org.hibernate.criterion.Order`类,该类允许你指定排序的属性和排序方式。
下面是一个示例,展示如何使用Criteria进行排序:```javaimport org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Criteria;import org.hibernate.criterion.Order;import org.hibernate.criterion.Restrictions;import java.util.List;public class YourClass {public List<YourEntity> getDataWithCustomOrder(SessionFactory sessionFactory) { Session session = sessionFactory.openSession();Criteria criteria = session.createCriteria(YourEntity.class);// 添加一些条件,如果需要的话criteria.add(Restrictions.eq("someProperty", someValue));// 添加自定义排序criteria.addOrder(Order.asc("propertyName")); // 按升序排序// 或者criteria.addOrder(Order.desc("propertyName")); // 按降序排序List<YourEntity> result = criteria.list();session.close();return result;}}```在上述示例中,`YourEntity`是你要查询的实体类,`someProperty`是你添加的其他条件,`propertyName`是你要排序的属性名称。
QBE (Query By Example)Criteria cri = session.createCriteria(Student.class);cri.add(Example.create(s)); //s是一个Student对象list cri.list();实质:创建一个模版,比如我有一个表serial有一个giftortoy字段,我设置serial.setgifttoy("2"), 则这个表中的所有的giftortoy为2的数据都会出来2: QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions类组成session = this.getSession();Criteria cri = session.createCriteria(JdItemSerialnumber.class);Criterion cron = Restrictions.like("customer",name);cri.add(cron);list = cri.list();==============================比较运算符HQL运算符QBC运算符含义= Restrictions.eq() 等于<> Restrictions.not(Exprission.eq()) 不等于> Restrictions.gt() 大于>= Restrictions.ge() 大于等于< Restrictions.lt() 小于<= Restrictions.le() 小于等于is null Restrictions.isnull() 等于空值is not null Restrictions.isNotNull() 非空值like Restrictions.like() 字符串模式匹配and Restrictions.and() 逻辑与and Restrictions.conjunction() 逻辑与or Restrictions.or() 逻辑或or Restrictions.disjunction() 逻辑或not Restrictions.not() 逻辑非in(列表) Restrictions.in() 等于列表中的某一个值ont in(列表) Restrictions.not(Restrictions.in())不等于列表中任意一个值between x and y Restrictions.between() 闭区间xy中的任意值not between x and y Restrictions.not(Restrictions..between()) 小于值X或者大于值y3: HQLString hql = "select ,avg(s.age) from Student s group by ";Query query = session.createQuery(hql);list = query.list();....4: 本地SQL查询session = sessionFactory.openSession();tran = session.beginTransaction();SQLQuery sq = session.createSQLQuery(sql);sq.addEntity(Student.class);list = sq.list();mit();16.1. 创建一个Criteria实例org.hibernate.Criteria接口表示特定持久类的一个查询。
Session是Criteria实例的工厂。
Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);List cats = crit.list();16.2. 限制结果集内容一个单独的查询条件是org.hibernate.criterion.Criterion接口的一个实例。
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%") ).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 Integer(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) ).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( age.eq( new Integer(2) ) )) ).add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) ).list();16.3. 结果集排序你可以使用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();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();16.4. 关联你可以使用createCriteria()非常容易的在互相关联的实体间建立约束。
List cats = sess.createCriteria(Cat.class).add( Restrictions.like("name", "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("", "") ).list();(createAlias()并不创建一个新的Criteria实例。
)Cat实例所保存的之前两次查询所返回的kittens集合是没有被条件预过滤的。