`

四 HQL与Criteria查询

阅读更多
HQL(Hibernate Query Language)
	面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;HQL主要通过Query来操作,Query的创建方式:
	Query q = session.createQuery(hql);
from Person
from User user where user.name=:name
from User user where user.name=:name and user.birthday < :birthday 
Criteria
	Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式:
	Criteria crit = session.createCriteria(DomainClass.class);
	简单属性条件如:criteria.add(Restrictions.eq(propertyName, value)),
	criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName))


注意 解决在映射的表名或者属性名是数据库的关键字,导致利用hibernate建表不能成功的问题
在一些数据库中 比如oracle中 user是作为一个关键字存在的 但是我们映射文件中的映射表名也是user 
这样利用hibernate建表是建不了的  可以使用``符号把对应的表名或者列名给引起来 
具体方法 <class name="User" table="`user`">形式解决 但是我测试后发现控制台没报错误 也输出了
sql语句 但是就是在数据库中没有表存在 
建议最佳解决办法:最好建的映射的表名或者或者映射的列名最好不要是数据库中的关键字

HQL语句的两种方式
第一种:from User as user where user.name=?;
第二种:from User as user where user.name=:name;

两种使用的区别:第一种 query.setString(0, name); 第二种 query.setString("name", name)注意"name" 必须跟
hql语句的:name一致;相比第一种,第二种的优势是,不会出现列名索引对应出错,而出现录入数据不正确的情况 并且
比较好维护 

操作HQL语句的Query接口
list()方法 把数据转化为list集合数据 
query.setFirstResult() 设置结果集的开始位置 query.setMaxResults() 设置结果集最长索引 用在分页显示数据的数据结果
uniqueResult() 如果数据库只有一行数据,那么就可以使用这个方法去查询数据 
iterate() 把查询到得数据转化为迭代器 


Criteria
Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式:
Criteria crit = session.createCriteria(DomainClass.class);
简单属性条件如:criteria.add(Restrictions.eq(propertyName, value)),
criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName))



.常用的查询限制方法

 

在例程9-1中,Restrictions.eq()方法表示equal,即等于的情况。Restrictions类提供了查询限制机制。它提供了许多方法,以实现查询限制。这些方法及其他一些criteria常用查询限制方法列于表9-1中。

 

表9-1 Criteria Query常用的查询限制方法

 

方    法 

说    明

 

Restrictions.eq() 

equal,=

 

Restrictions.allEq() 

参数为Map对象,使用key/value进行多个等于的对比,相当于多个Restrictions.eq()的效果

 

Restrictions.gt() 

greater-than, >

 

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,否则返回false

 

Restrictions.isNotNull() 

与Restrictions.isNull()相反

 

Order.asc() 

根据传入的字段进行升序排序

 

Order.desc() 

根据传入的字段进行降序排序

 

MatchMode.EXACT 

字符串精确匹配,相当于“like 'value'”

 

MatchMode.ANYWHERE 

字符串在中间位置,相当于“like '%value%'”

 

MatchMode.START 

字符串在最前面的位置,相当于“like 'value%'”

 

MatchMode.END 

字符串在最后面的位置,相当于“like '%value'”

 

例1:查询学生名字以t开头的所有Student对象。

 

Criteria cr = session.createCriteria(Student.class);

cr.add(Restrictions.like(“name”, “t%”))

List list = cr.list();

Student stu = (Student)list.get(0);

 

或者使用另一种方式: 

Criteria cr = session.createCriteria(Student.class);

cr.add(Restrictions.like(“name”, “t”, MatchMode.START))

List list = cr.list();

Student stu = (Student)list.get(0); 

 

例2:查询学生姓名在Bill, Jack和Tom之间的所有Student对象。 

String[] names = {“Bill”, “Jack”, “Tom”}

Criteria cr = session.createCriteria(Student.class);

cr.add(Restrictions.in(“name”, names))

List list = cr.list();

Student stu = (Student)list.get(0); 

 

例3:查询学生的年龄age等于22或age为空(null)的所有Student对象。 

Criteria cr = session.createCriteria(Student.class);

cr.add(Restrictions.eq(“age”, new Integer(22));

cr.add(Restrictions.isNull(“age”));

List list = cr.list();

Student stu = (Student)list.get(0); 

 

例4:查询学生姓名以字母F开头的所有Student对象,并按姓名升序排序。 

Criteria cr = session.createCriteria(Student.class);

cr.add(Restrictions.like(“name”, “F%”);

cr.addOrder(Order.asc(“name”));

List list = cr.list();

Student stu = (Student)list.get(0);

 

调用Order.asc的方法应是Criteria的addOrder()方法。

 

 

 

 

下面给出一个小例子:

这里只列出其中一个页面,其它页面都没有列出,主要是让大家看看Query和Criteria怎么用

首先是Query的用法:

package cn.itcast.hibernate.domain;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import cn.itcast.hibernate.method.MethodManager;

public class QueryTest {

/**
* @param args
*/
public static void main(String[] args) {
   User user = new User();
  
   for(int i=1; i<5; i++) {
    user.setName("Aaron"+i);
    user.setBirthday(new Date());
    MethodManager.addUser(user);//保存数据
   }
   User ss = new User();
   ss.setName("Aaron1");
   ss.setBirthday(new Date());
   MethodManager.addUser(ss);
  
   User ss1 = new User();
   ss1.setName("Aaron1");
   ss1.setBirthday(new Date());
MethodManager.addUser(ss1);
  
  query("Aaron1");

}

@SuppressWarnings("unchecked")
static void query(String userName){
   Session session = null;
   try{
    session = HibernateUtils.getSession();
    String hql = "from User user where user.name = ?";
    //String hql1 = "from User user where user.name.birthday is not null"; //多个属性不为空
    //String hql = "from User as user where user.name = :ss";
    Query query = session.createQuery(hql);
    query.setString(0, userName);//问号的位置从0开始
   //query.setString("ss", userName);//当多个问号时,可以指定别名,这样可以防止混乱
   
    query.setFirstResult(0);//表示从结果集的第一条记录开始
    query.setMaxResults(10);//表示每次取20条记录,这样可以实现跨数据库分页     
   List<User> list = query.list();
   /* Iterator<User> iterator = query.iterate();
    while(iterator.hasNext()){
     System.out.println(iterator.next().getName());
    } */
   
    //User u = (User)query.uniqueResult();//确定独一无二的结果
    //System.out.println(u);
   
/*   List names = new ArrayList();
    names.add("Aaron1");
    names.add("Aaron2");
    Query q = session.createQuery("from User user where user.name in (:naa) order by user.birthday desc");
    q.setParameterList("naa", names);
   
    List<User> cats = q.list();
    for(User userList : cats){
     System.out.println(userList.getName()+","+userList.getBirthday());
    }
    *///查询条件是一个集合
  
    for(User userList : list){
     System.out.println(userList.getName()+","+userList.getBirthday());
    }
   } finally {
    if(session!=null)
     session.close();//必须关闭session
   }
}
}



Criteria的用法:

package cn.itcast.hibernate.domain;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import cn.itcast.hibernate.method.MethodManager;

public class CriteriaQuery {

/**
* @param args
*/
public static void main(String[] args) {
   User user = new User();
  
   for(int i=1; i<5; i++) {
    user.setName("Aaron"+i);
    user.setBirthday(new Date());
    MethodManager.addUser(user);//保存数据
   }
   User ss = new User();
   ss.setName("Aaron1");
   ss.setBirthday(new Date());
   MethodManager.addUser(ss);
  
   User ss1 = new User();
   ss1.setName("Aaron1");
   ss1.setBirthday(new Date());
   MethodManager.addUser(ss1);
  
   query("Aaron1");

}

@SuppressWarnings("unchecked")
static void query(String userName){
   Session session = null;
   try{
    //Criteria和Restrictions实现条件查询
    session = HibernateUtils.getSession();
    Criteria criteria = session.createCriteria(User.class);
    criteria.add(Restrictions.eq("name", userName));
    criteria.add(Restrictions.le("birthday", new Date()));//多个add表示与

   // criteria.add(Restrictions.or(Restrictions.eq("name", userName), Restrictions.eq("name", "Aaron2")));//表示逻辑或,表示名字为Aaron和Aaron1的都查询出来
   criteria.addOrder(Order.desc("id")); //按照id倒序
    //criteria.setFirstResult(0);
    //criteria.setMaxResults(30);
    List<User> list = criteria.list();
    for(User userList : list){
     System.out.println(userList.getName()+","+userList.getBirthday());
    }
   } finally {
    if(session!=null)
     session.close();//必须关闭session
   }
}

}

 

  补充 :Criteria查询

 经验心得:相比Hql来说,Criteria查询方式可以使程序员在不懂sql的情况下进行数据的查询操作,并且Criteria查询方式其实也有Query的同样的查询方法 如分页用到的查询方式,不过官方推荐使用HQL查询

分享到:
评论

相关推荐

    Hibernate的HQL与Criteria资料

    学习Hibernate的HQL和Criteria API,不仅可以提高数据库操作的效率,还能更好地利用ORM的优势,减少与数据库交互的复杂度。掌握这两者,对于提升Java开发中的数据操作能力大有裨益。这份资料将帮助你深入理解这两种...

    HQL与Criteria的对照表.pdf

    本文将基于提供的文件信息,深入探讨HQL与Criteria API在数据查询操作中的应用,并通过具体的代码示例进行对比分析。 #### 查询所有记录 **HQL:** ```java String hql = "from Employee"; List&lt;Employee&gt; result ...

    HQL参数查询和Criteria查询

    1、掌握Hibernate框架应用项目 2、学习HQL参数查询和Criteria查询 3、比较HQL和Criteria的不同 建立web项目,通过页面查询构造动态查询语句,struts2和hibernate框架整合。

    Hibernate中的查询:HQL、Criteria、原生SQl

    本篇文章将深入探讨Hibernate中的三种主要查询方式:HQL(Hibernate Query Language)、Criteria API以及原生SQL。 一、HQL(Hibernate Query Language) HQL是Hibernate提供的一种面向对象的查询语言,它类似于SQL...

    Hibernate-HQL、Criteria、SQL实现查询对照以及增删改代码

    本文旨在为读者呈现不同的方式查询方式:HQL方式的查询、SQL原生态SQL方式的查询、以及Criteria方式的查询,拓展查询的不同实现思路,开阔视野、并涵盖了部分的Hibernate增删改的基本操作。

    hql criteria分页

    #### 四、HQL与Criteria API对比分析 尽管HQL和Criteria API都能实现分页功能,但两者之间还是存在一些区别: - **语法风格**:HQL更接近SQL,而Criteria API则采用了Java Bean的方式,更适合进行复杂查询条件的构建...

    Hibernate实例开发 HQL 与 QBC 查询

    本教程将深入探讨Hibernate中的两种查询方式:HQL(Hibernate Query Language)和QBC(Query By Example)。通过实例开发,我们将了解这两种查询方法的使用和它们之间的差异。 首先,HQL是Hibernate专门设计的一种...

    HQL是hibernate自己的一套查询

    与传统的SQL语言不同,HQL更加注重于面向对象的特性,它支持Java类名和属性名作为查询条件,使得开发者可以直接使用Java对象模型来编写查询语句,而不需要了解底层数据库的具体表结构。HQL的这种特性大大提高了代码...

    hibernateCriteria查询

    与传统的SQL查询相比,Criteria查询更加面向对象,易于理解和维护。在Hibernate框架中,Criteria查询是除HQL之外的另一种常用查询方式。 #### 二、Criteria 接口 `org.hibernate.Criteria` 接口代表了针对某个特定...

    Hibernate之HQL查询

    **正文** ...在实际项目中,结合HQL和 Criteria 查询,以及Querydsl等工具,可以构建更加灵活和健壮的数据访问层。在进行HQL编程时,应注意避免SQL注入风险,合理使用命名参数,以确保代码的安全性。

    hibernate 查询?Hibernate的HQL查询

    【描述】:在ORM框架Hibernate中,数据查询和检索是一个核心功能,它提供了多种查询方式,包括标准化对象查询(Criteria Query)、Hibernate查询语言(HQL)和原生SQL查询。其中,HQL作为官方推荐的查询方式,具有...

    HQL语言大全 高清晰可复制版

    5. **HQL与Criteria查询的比较** Hibernate还提供了Criteria API,它是另一种对象化的查询方式,更加强调代码的可读性和类型安全。虽然两者都能完成相同的工作,但根据项目需求和个人喜好,开发者可以选择更适合的...

    NHibernate HQL 条件查询

    #### QBC(Query By Criteria)与HQL对比 在NHibernate中,除了HQL之外,还提供了另一种查询方式——QBC(Query By Criteria)。QBC是一种基于API的查询构建方法,它通过一系列的API调用来构造查询条件,相比于HQL...

    Hibernate-Criteria_模糊查询

    在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...

    Hibernate hql查询

    Hibernate Query Language(HQL)是Hibernate框架提供的一种面向对象的查询语言,它是基于Java的,但其语法与SQL类似,用于在Java应用中操作对象。HQL允许开发者用类名和属性名而不是表名和列名进行数据库查询,这...

    hibernate3.2 (十)HQL查询

    四、HQL与SQL的映射 虽然HQL更面向对象,但仍然可以转换为SQL执行。Hibernate会自动将HQL语句转化为相应的SQL,这个过程称为查询优化。开发者可以通过开启Hibernate的日志来查看实际执行的SQL语句,以便进行性能分析...

    hibernate_hql.rar_HQL

    四、HQL分组与排序 通过`group by`和`order by`关键字,HQL可以实现数据的分组和排序。例如,按照城市分组并按年龄降序排列: ```java String hql = "from User group by city order by age desc"; ``` 五、HQL子...

    HQL的具体内容和使用

    Criteria查询是另一种面向对象的查询方式,通过Criteria接口、Restrictions和MatchMode等工具来构建和执行查询,提供了更灵活的查询构建方式。 总之,HQL是Hibernate中强大的查询工具,它允许开发者以更符合面向...

    Hibernate数据检索(HQL)笔记

    HQL 语句是一种类似 SQL 的查询语言,用于定义查询条件和检索数据,而 Criteria API 则是一种基于对象的查询接口,用于构建查询条件和检索数据。 在本笔记中,我们将学习如何使用 Hibernate 的 Criteria API 进行...

Global site tag (gtag.js) - Google Analytics