2009-06-04 5 views

Trả lời

51

Đây chính là điều dự báo là dành cho. Dưới đây là một ví dụ:

Criteria cr = session.createCriteria(User.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.property("id"), "id") 
     .add(Projections.property("Name"), "Name")) 
    .setResultTransformer(Transformers.aliasToBean(User.class)); 

    List<User> list = cr.list(); 

Trong thực tế, nếu bạn nhìn vào các tài liệu cho "tài sản lười biếng lấy" họ đặc biệt nói:


"A (? Tốt hơn) cách khác nhau để tránh cột không cần thiết lần đọc, ít nhất là đối với các giao dịch chỉ đọc là sử dụng các tính năng chiếu của truy vấn HQL hoặc Tiêu chí. Điều này tránh được nhu cầu xử lý bytecode thời gian xây dựng và chắc chắn là một giải pháp ưu tiên. "


Bằng cách này, có một câu hỏi liên quan mà bạn cũng có thể quan tâm đến: Hibernate Query By Example and Projections

+4

Có thể thực hiện điều đó thông qua quấy rối HQL không? – Antoniossss

1

Thông thường bạn không muốn tải một phần thuộc tính của đối tượng. Nhưng nếu bạn phải, thấy điều này:

http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/performance.html#performance-fetching-lazyproperties

Đối với hành vi báo cáo giống như đồng bằng bạn có thể sử dụng các truy vấn thực thể:

sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class); 

http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/querysql.html#d0e17633

4

Tôi thực sự trễ trả lời này, nhưng bạn có thể thêm một biến kết quả tùy chỉnh để truy vấn đối tượng như dưới đây.

Query query = session 
     .getNamedQuery(
       "someNamedQueryWhichISHQL") 
     .setString("cod", "10") 
     .setResultTransformer(new ResultTransformer() { 

      public Object transformTuple(Object[] row, String[] arg1) { 
       User usr = new User(row[0],row[1]); 
       return usr 
      } 

      public List transformList(List arg0) { 

       return arg0; 
      } 
     }); 
return query.list();