在一般的增删改查中我们有时候不需要查询一个类的所以属性,我们仅仅需要部分属性。如果是全部查询将会非常浪费你的时间(确切是客户的时间)。因此投影查询在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();