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