Hibernate中Criteria的完整用法

合集下载

criteriaquery 检索nested类型 -回复

criteriaquery 检索nested类型 -回复

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进行查询之前,我们还可以设置各种查询条件。

Criteria查询

Criteria查询

Criteria查询实现分页 2-1
Criteria 的setMaxResults()方法可以限定查询 返回数据的行数 Criteria 的setFirstResult()设定查询返回结果 的第一行数据的位置 结合以上Criteria的两个方法即可实现简单分页
Criteria查询实现分页 2-2
Criteria查询排序 2-1
Criteria 查询不仅能组合出SQL中where子句的 功能,还可以组合出排序查询功能 使用org.hibernate.criterion.Order对结果进行 排序 排序的方法为:
asc() desc()
Criteria查询排序 2-2
SessionFactory sessionFactory = new Configuration().configure() 创建Criteria对象 .buildSessionFactory(); Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(House.class); criteria.addOrder(Order.desc("price")); List result = criteria.list(); 以价格降序的方式排列 Iterator it = result.iterator(); while (it.hasNext()) { 加入Order 条件 House house = (House) it.next(); System.out.println("标题:" + house.getTitle() + " 价格" + house.getPrice()); } session.close(); sessionFactory.close(); 演示示例:Criteria排序

Criteria

Criteria

order
ID varchar2(14)
order_number number(10)
customer_ID varchar2(14)
现在有两条HQL查询语句,分别如下:
from Customer c inner join c.orders o group by c.age;(1)
select c.ID,,c.age,o.ID,o.order_number,o.customer_ID
for(int i=0;i
System.out.println(list.get(i));
}
我们只检索了User实体的name属性对应的数据,此时返回的包含结果集的list中每个条目都是String类型的name属性对应的数据。我们也可以一次检索多个属性,如下面程序:
List list=session.createQuery(“select ,user.age from User user ”).list();
Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形势如下:
from User user where user.age=20 and like ‘%zx%’;
2、 实体的更新和删除:
在继续讲解HQL其他更为强大的查询功能前,我们先来讲解以下利用HQL进行实体更新和删除的技术。这项技术功能是Hibernate3的新加入的功能,在Hibernate2中是不具备的。比如在Hibernate2中,如果我们想将数据库中所有18岁的用户的年龄全部改为20岁,那么我们要首先将年龄在18岁的用户检索出来,然后将他们的年龄修改为20岁,最后调用Session.update()语句进行更新。在Hibernate3中对这个问题提供了更加灵活和更具效率的解决办法,如下面的代码:

条件类Criteria的用法

条件类Criteria的用法

复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如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使用总结(目前只会单表)

criteria使用总结(目前只会单表)

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结果行数、查询列表的几种方法

Hibernate查询sql结果行数、查询列表的几种方法

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();。

Criteria

Criteria

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对象 逻辑运算查询

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对象的列表。

四、多重条件查询在某些情况下,我们可能需要同时满足多个条件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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集合是没有被条件预过滤的。

相关文档
最新文档