Hibernate检索方式(补充)

编程

* 

ps :

一 : 导航对象图检索方式

Customer c=session.get(Customer.class,2);

c.getOrders().size();

  • 通过在hibernate中进行映射关系,在hibernate操作时,可以通过导航方式得到其关联的持久化对象信息。

二 : OID检索方式

session.get(Customer.class,3);

session.load(Order.class,1);

  • Hibernate中通过get/load方法查询指定的对象,要通过OID来查询。

三 : QBC

  • QBC(query by criteria),它是一种更加面向对象的检索方式。
  • QBC步骤:

    1. 通过Session得到一个Criteria对象:session.createCriteria()
    2. 设定条件:Criterion实例,它的获取可以通过Restrictions类提供静态。

      • Criteriaadd方法用于添加查询条件

    3. 调用list进行查询:criterfia.list()

(一) 基本检索

//基本检索

@Test

public void test1(){

//查询所有的Customer

Session session=HibernateUtils.openSession();

session.beginTransaction();

//1.得到一个Criteria对象

Criteria criteria=session.createCriteria(Customer.class);

//2.调用list方法

List<Customer> list = criteria.list();

System.out.println(list);

session.getTransaction().commit();

session.close();

}

(二) 排序检索

//排序查询

@Test

public void test2(){

// 查询订单信息 根据订单的价格进行排序

Session session = HibernateUtils.openSession();

session.beginTransaction();

Criteria criteria=session.createCriteria(Order.class);

//指定排序

//criteria.addOrder(org.hibernate.criterion.Order.desc("money"));//降序

criteria.addOrder(org.hibernate.criterion.Order.asc("money"));//降序

List<Order> list = criteria.list();

System.out.println(list);

session.getTransaction().commit();

session.close();

}

  • 注意在criteria.addOrder()方法的参数使用的Orderhibernate中的对象

(三) 条件检索(重点掌握,其他框架都能写)

  • Restrictions:限制,约束。用于添加静态条件

    • and():添加多个静态条件
    • gt():>
    • lt():<
    • ge():>=
    • le():<=
    • eq():==

//条件检索

@Test

public void test3(){

Session session = HibernateUtils.openSession();

session.beginTransaction();

//1. 查询名称叫张某的客户:张_

Criteria criteria=session.createCriteria(Customer.class);

Criterion like=Restrictions.like("name","张_");//其他条件lt

criteria.add(like);//添加条件

Customer c=(Customer) criteria.uniqueResult();

System.out.println(c);

//2.查询订单价格在1050以上的,并且它的客户是张某

Criteria cri=session.createCriteria(Order.class);

SimpleExpression gt = Restrictions.gt("money",1005d);

SimpleExpression eq = Restrictions.eq("c", c);

LogicalExpression and = Restrictions.and(gt,eq);

cri.add(and);

//List orders = cri.add(Restrictions.and(Restrictions.gt("money", 1050d),Restrictions.eq("c", c))).list();

List<Customer> list = cri.list();

System.out.println(list);

session.getTransaction().commit();

session.close();

}

(四) 分页检索

// 分页检索

@Test

public void test4() {

Session session = HibernateUtils.openSession();

session.beginTransaction();

Criteria criteria = session.createCriteria(Order.class);

criteria.setFirstResult((2 - 1) * 6);

criteria.setMaxResults(6);

List<Order> list = criteria.list();

System.out.println(list);

session.getTransaction().commit();

session.close();

}

(五) 统计分组检索(很重要,非常规操作的时候用)

  • count
  • sum
  • avg
  • max
  • min

//统计检索

@Test

public void test5(){

Session session = HibernateUtils.openSession();

session.beginTransaction();

Criteria criteria=session.createCriteria(Order.class);

//Object obj = criteria.setProjection(Projections.rowCount()).uniqueResult();//统计总行数 count(*)

//System.out.println(obj);

//2.订单的总价格---分组统计客户

//Object obj = criteria.setProjection(Projections.sum("money")).uniqueResult();//统计总金额

//System.out.println(obj);

//3.按客户分组显示客户订单总金额

criteria.setProjection(Projections.projectionList().add(Projections.sum("money")).add(Projections.groupProperty("c")));

List<Object[]> list = criteria.list();

System.out.println(list);

for (Object[] objects : list) {

for (Object obj : objects) {

System.out.println(obj);

}

}

session.getTransaction().commit();

session.close();

}

(六) 离线条件检索

  • 离线:条件是在web层封装好后传递到dao层的,并不是直接得到检索条件
  • DetachedCriteria

//离线条件检索

@Test

public void test6(){

//1.得到一个DetachedCriteria

DetachedCriteria dc=DetachedCriteria.forClass(Customer.class);

dc.add(Restrictions.like("name", "张_"));

//2.生成Criteria执行操作

Session session = HibernateUtils.openSession();

session.beginTransaction();

Criteria criteria = dc.getExecutableCriteria(session);

List<Customer> list = criteria.list();

System.out.println(list);

session.getTransaction().commit();

session.close();

}

四 : 本地SQL

(一) 单表操作

// 测试执行本地sql

@Test

public void test1() {

Session session = HibernateUtils.openSession();

session.beginTransaction();

SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer");

// List<Object[]> list = sqlQuery.list();

sqlQuery.addEntity(Customer.class);

List list = sqlQuery.list();

System.out.println(list);

session.getTransaction().commit();

session.close();

}

  • 本地sql也支持命名查询。
  • 可以将sql语句定义在hbm文件中,也可以使用注解。

<sql-query name="">

select * from t_customer

</sql-query>

  • 本地命名sql注解定义

@NamedNativeQuery(name="findCustomer",query="select * from t_customer")

  • 如果执行这个命名的sql会产生异常

// 测试本地sql命名查询

@Test

public void test2() {

Session session = HibernateUtils.openSession();

session.beginTransaction();

Query query = session.getNamedQuery("findCustomer");

List list = query.list();

System.out.println(list);

session.getTransaction().commit();

session.close();

}

ExceptionInInitializerError

* 初始化错误

Pure native scalar queries are not yet suppored

* 本地语句不支持

  • 出现问题的原因:是hibernate不知道执行select * from t_customer后如何将结果封装。

@SqlResultSetMapping(

name="customerSetMapping",

entities={

@EntityResult(

entityClass=Customer.class,

fields={

@FieldResult(name="id",column="id"),

@FieldResult(name="name",column="name")

}

)

}

)

@NamedNativeQuery(

name="findCustomer",

query="select * from t_customer",

resultSetMapping="customerSetMapping"

)

(二) 多表操作

1.内连接 INNER JOIN ON

SELECT

*

FROM

t_customer AS c

INNER JOIN t_order AS o ON c.id = o.c_customer_id;

  • 使用内连接它只能将有关联的数据得到。

2.隐式内连接

  • 使用"逗号"将表分开,使用WHERE来消除迪卡尔积

SELECT

*

FROM

t_customer AS c,

t_order o

WHERE

c.id = o.c_customer_id;

3.外连接

  • 左外LEFT OUTER JOIN
  • 右外RIGHT OUTER JOIN
  • OUTER可以省略

SELECT

*

FROM

t_customer c

LEFT OUTER JOIN t_order o ON c.id = o.c_customer_id;

以上是 Hibernate检索方式(补充) 的全部内容, 来源链接: utcz.com/z/511322.html

回到顶部