Hibernate投影查询

在一般的增删改查中我们有时候不需要查询一个类的所以属性,我们仅仅需要部分属性。如果是全部查询将会非常浪费你的时间(确切是客户的时间)。因此投影查询在hibernate中应运而生。我们还是用例子来说明问题。


先创建我们所需要的两个po类,一个客户,一个订单,在这里是一对多的关系。

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class Customer   
  2. {  
  3.     private Integer id;  
  4.     private String name;  
  5.     private Set<Order> orders=new HashSet<Order>();  
  6.       
  7.     public Customer() {  
  8.         super();  
  9.     }  
  10.     public Customer(Integer id, String name) {  
  11.         super();  
  12.         this.id = id;  
  13.         this.name = name;  
  14.     }  
  15.     public Integer getId() {  
  16.         return id;  
  17.     }  
  18.     public void setId(Integer id) {  
  19.         this.id = id;  
  20.     }  
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.     public void setName(String name) {  
  25.         this.name = name;  
  26.     }  
  27.     public Set<Order> getOrders() {  
  28.         return orders;  
  29.     }  
  30.     public void setOrders(Set<Order> orders) {  
  31.         this.orders = orders;  
  32.     }  
  33.     @Override  
  34.     public String toString() {  
  35.         return "Customer [id=" + id + ", name=" + name + ", orders=" + orders  
  36.                 + "]";  
  37.     }  
  38.       
  39. }  


[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class Order   
  2. {  
  3.     private Integer id;  
  4.     private Double price;  
  5.     private Customer c;  
  6.     public Integer getId() {  
  7.         return id;  
  8.     }  
  9.     public void setId(Integer id) {  
  10.         this.id = id;  
  11.     }  
  12.     public Double getPrice() {  
  13.         return price;  
  14.     }  
  15.     public void setPrice(Double price) {  
  16.         this.price = price;  
  17.     }  
  18.     public Customer getC() {  
  19.         return c;  
  20.     }  
  21.     public void setC(Customer c) {  
  22.         this.c = c;  
  23.     }  
  24.     @Override  
  25.     public String toString() {  
  26.         return "Order [id=" + id + ", price=" + price + "]";  
  27.     }  
  28.       
  29. }  

然后我们来持久化我们的po类,具体配置如下

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 持久化类与数据表的映射关系 -->  
  2. <!-- 联合主键配置方式 -->  
  3. <hibernate-mapping>  
  4.     <class name="com.canyugan.onetomany.Customer" table="customer">  
  5.         <id name="id">  
  6.             <generator class="increment"/>  
  7.         </id>  
  8.         <property name="name"/>  
  9.         <!--  
  10.         设置级联 当保存顾客时也会保存订单   
  11.          -->  
  12.          <!-- inverse=true  则由关联的对方维护 -->  
  13.         <set name="orders" cascade="all-delete-orphan" inverse="true">  
  14.             <key column="cid"/>  
  15.             <one-to-many class="com.canyugan.onetomany.Order" />  
  16.         </set>  
  17.     </class>  
  18. </hibernate-mapping>  


[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <hibernate-mapping>  
  2.     <class name="com.canyugan.onetomany.Order" table="orders">  
  3.         <id name="id">  
  4.             <generator class="increment"/>  
  5.         </id>  
  6.         <property name="price"/>  
  7.         <many-to-one name="c" class="com.canyugan.onetomany.Customer"   
  8.                     column="cid"/>  
  9.     </class>  
  10. </hibernate-mapping>  


最后可以在hibernate.cfg.xml中配置数据库连接的一些信息。


然后我们可以来测试:

先向数据库保存测试数据:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. // 得到sesion  
  2. Session session = HibernateUtils.getSession();  
  3. // 开启事务  
  4. session.beginTransaction();  
  5. Customer c=new Customer();  
  6. c.setName("Canyugan");  
  7. for(int i=0;i<10;i++)  
  8. {  
  9.     Order o=new Order();  
  10.     o.setPrice(3000d+i);  
  11.     c.getOrders().add(o);  
  12. }  
  13. session.save(c);  
  14. // 提交事务  
  15. session.getTransaction().commit();  
  16. session.close();  


然后是我们的投影查询:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. // 得到sesion  
  2. Session session = HibernateUtils.getSession();  
  3. // 开启事务  
  4. session.beginTransaction();  
  5. List<List<Object[]>> list=session.createQuery("select new List(id,name) from Customer").list();  
  6. System.out.println(list);  
  7. // 提交事务  
  8. session.getTransaction().commit();  
  9. session.close();  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值