您的位置:首页 > 产品设计 > UI/UE

hibernate学习之四——Query和Criteria接口

2017-06-09 15:24 411 查看
Query 和 Criteria 接口是 Hibernate 的查询接口,用于向数据库查询对象以及控制执行查询的过程。

Query 实例包装了一个 HQL(Hibernate Query Language)查询语句,HQL 查询语句与 SQL 查询语句有些相似,但
HQL 查询语句是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名。

Critieria 接口完全封装了基于字符串形式的查询语句,比 Query 接口更加面向对象,Criteria 接口擅长于执行动态查询

package com.test;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import com.bean.User;
import com.util.HibernateUtil;

public class QueryAndCniteria {
private static SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

//1.1,简单绑定参数查询,不使用表名而使用类名,bean
//按参数位置绑定: 在 HQL 查询语句中用“?”来定义参数位置
@Test
public void query1(){
//1,获取session对象
Session session = sessionFactory.openSession();
//2,hql
Query query = session.createQuery("from User where name=? and age=? ");
//3,为?赋值
query.setString(0,"dada");
query.setInteger(1,11);

List<User> list = query.list();
for(User user:list){
System.out.println(user.toString());
}
session.close();
}
//1.2,简单绑定参数查询,不使用表名而使用类名,bean
//按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以“:”开头
@Test
public void query2(){
Session session = sessionFactory.openSession();
Query query = session.createQuery("from User where name=:name and age=:age");
//第一个参数代表名字,第二个代表值
query.setString("name", "dada");
query.setInteger("age", 20);
List<User> list = query.list();
for(User user : list){
System.out.println(user.toString());
}
session.close();
}

//2,投影查询
@Test
public void query3(){
Session session = sessionFactory.openSession();
//注意这里投影查询哪些属性,那么bean类要有对应的构造方法
/*	public User(String uid, String name) {
super();
this.uid = uid;
this.name = name;
}*/
Query query = session.createQuery("select new com.bean.User(uid,name) from User");
List<User> list = query.list();
for(User user : list){
System.out.println(user.toString());
}
session.close();
}

//3,分页查询
@Test
public void query4(){
Session session = sessionFactory.openSession();
Query query = session.createQuery("from User");
//设置分页查询的起始页面
query.setFirstResult(0);
//设置分页查询的显示页数
query.setMaxResults(3);

List<User> list = query.list();
for(User user : list){
System.out.println(user.toString());
}
session.close();

}

//4,QBC(Query By Criteria)
/*
QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这
种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口。
QBC 提供的查询方式由:Criteria 接口,Criterion 接口和 Expression 类组成,支
持在运行时动态生成查询语句
*/
//4.1,Criteria简单查询
@Test
public void query5(){
//1,获取session对象
Session session = sessionFactory.openSession();
//2,通过session对象创建Criteria对象
Criteria crit = session.createCriteria(User.class);
//3,添加查询条件
crit.add(Restrictions.eq("name","xiaohong"));
crit.add(Restrictions.eq("age",0));

List<User> list = crit.list();
for(User user:list){
System.out.println(user.toString());
}
}

//4.2,Criteria - 存面向对象的数据库查询方式
//模糊查询
@Test
public void query6(){
Session session = sessionFactory.openSession();
Criteria crit = session.createCriteria(User.class);
//添加条件
crit.add(Restrictions.like("name", "%da%"));
List<User> list = crit.list();
for(User user : list){
System.out.println(user.toString());
}
session.close();
}
}


相关方法说明

短语  含义

Restrictions.eq  等于=

Restrictions.allEq  方法的参数为一个 Map 类型对象,包含多个名/值

对对应关系, 相当于多个 Expression.eq 的叠加

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 关系

Restrictions.sqlRestriction Sql 限定查询
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java hibernate
相关文章推荐