Hibernate投影查询
Posted 时间沉淀美好
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate投影查询相关的知识,希望对你有一定的参考价值。
在一般的增删改查中我们有时候不需要查询一个类的所以属性,我们仅仅需要部分属性。如果是全部查询将会非常浪费你的时间(确切是客户的时间)。因此投影查询在Hibernate中应运而生。我们还是用例子来说明问题。
先创建我们所需要的两个po类,一个客户,一个订单,在这里是一对多的关系。
public class Customer
private Integer id;
private String name;
private Set<Order> orders=new HashSet<Order>();
public Customer()
super();
public Customer(Integer id, String name)
super();
this.id = id;
this.name = name;
public Integer getId()
return id;
public void setId(Integer id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public Set<Order> getOrders()
return orders;
public void setOrders(Set<Order> orders)
this.orders = orders;
@Override
public String toString()
return "Customer [id=" + id + ", name=" + name + ", orders=" + orders
+ "]";
public class Order
private Integer id;
private Double price;
private Customer c;
public Integer getId()
return id;
public void setId(Integer id)
this.id = id;
public Double getPrice()
return price;
public void setPrice(Double price)
this.price = price;
public Customer getC()
return c;
public void setC(Customer c)
this.c = c;
@Override
public String toString()
return "Order [id=" + id + ", price=" + price + "]";
然后我们来持久化我们的po类,具体配置如下
<!-- 持久化类与数据表的映射关系 -->
<!-- 联合主键配置方式 -->
<hibernate-mapping>
<class name="com.canyugan.onetomany.Customer" table="customer">
<id name="id">
<generator class="increment"/>
</id>
<property name="name"/>
<!--
设置级联 当保存顾客时也会保存订单
-->
<!-- inverse=true 则由关联的对方维护 -->
<set name="orders" cascade="all-delete-orphan" inverse="true">
<key column="cid"/>
<one-to-many class="com.canyugan.onetomany.Order" />
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.canyugan.onetomany.Order" table="orders">
<id name="id">
<generator class="increment"/>
</id>
<property name="price"/>
<many-to-one name="c" class="com.canyugan.onetomany.Customer"
column="cid"/>
</class>
</hibernate-mapping>
然后我们可以来测试:
先向数据库保存测试数据:
// 得到sesion
Session session = HibernateUtils.getSession();
// 开启事务
session.beginTransaction();
Customer c=new Customer();
c.setName("Canyugan");
for(int i=0;i<10;i++)
Order o=new Order();
o.setPrice(3000d+i);
c.getOrders().add(o);
session.save(c);
// 提交事务
session.getTransaction().commit();
session.close();
然后是我们的投影查询:
// 得到sesion
Session session = HibernateUtils.getSession();
// 开启事务
session.beginTransaction();
List<List<Object[]>> list=session.createQuery("select new List(id,name) from Customer").list();
System.out.println(list);
// 提交事务
session.getTransaction().commit();
session.close();
以上是关于Hibernate投影查询的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate5-投影查询,分组查询,Query的List和Iterate
[原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询