2011-03-22 58 views
0

我有一個表: 用戶的列:{ID,姓名,地址}休眠負載所選列

我想用Hibernate來從該表中只選擇ID。但我不想使用HQL進行原生SQL查詢。我想使用Criteria對象。有沒有辦法做到這一點?

感謝,

肖恩·阮

回答

4

是。您必須使用投影:

Criteria c = session.createCriteria(User.class, "u"); 
c.setProjection(Projections.property("u.id")); 
return c.list(); // the list of all the user IDs 

但是HQL對於這種查詢更具可讀性和直觀性。標準是動態生成的查詢有用,或者重用查詢的部分在若干個:

return session.createQuery("select u.id from User u").list(); 
+0

或者使用c.setProjection(Projections.id()); – 2012-08-16 03:51:49

0

它可以使用ResultTransformer適用於原生SQL查詢,允許其返回非管理的實體。

爲例,說我們有像下面

@Entity 
@Table(name = "demodetail") 
public class EntDemodetail { 

    Integer id; 
    String description; 
    Integer demoid; 
    EntDemo demo; 

    @Id 
    @GeneratedValue 
    @Column(name = "id_detail", unique = true, nullable = false) 
    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @Column(name="detaildesc") 
    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 


    @Column(name="demoid") 
    public Integer getDemoid() { 
     return demoid; 
    } 

    public void setDemoid(Integer demoid) { 
     this.demoid = demoid; 
    } 


    @OneToOne() 
    @JoinColumn(name="demoid") 
    public EntDemo getDemo() { 
     return demo; 
    } 

    public void setDemo(EntDemo demo) { 
     this.demo = demo; 
    } 

} 

你可以閱讀這個實體的一些列像下面

/* Method to READ some columns of an entity with native sql */ 
     public void nativesqlwithresulttransformer(){ 
      Session session = HibernateUtilMysql.getSessionFactory().openSession(); 
      Transaction tx = null; 
      try{ 
      tx = session.beginTransaction(); 

      String sql = "SELECT id_detail as id FROM demodetail d"; // 
      SQLQuery query = session.createSQLQuery(sql); 

      List results = query.setResultTransformer(Transformers.aliasToBean(EntDemodetail.class)).list(); 

      for (Iterator iterator = 
           results.iterator(); iterator.hasNext();){ 
       EntDemodetail entdemodetail = (EntDemodetail) iterator.next(); 
       System.out.print("Id: " + entdemodetail.getId()); 
       //System.out.print("Desc: " + entdemodetail.getDescription()); 

      } 
      tx.commit(); 
      }catch (HibernateException e) { 
      if (tx!=null) tx.rollback(); 
      e.printStackTrace(); 
      }finally { 
      session.close(); 
      } 
     } 

更多信息entdemodetail實體,你可以看到http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/querysql.html