2010-08-30 68 views
2

我只需要提取特定的字段而不是所有字段。我所有的桌子都有審覈表演(4)。我希望在選擇時省略。如何從映射做到這一點。有沒有其他方法?如何查詢休眠條件中的特定字段

Criteria criteria = session.createCriteria(Property.class, "property") 
       .createAlias("property.propertyType", "type").createAlias(
         "property.propertyConcern", "propertyConcern", 
         CriteriaSpecification.LEFT_JOIN).createAlias(
         "propertyConcern.concern", "concern", 
         CriteriaSpecification.LEFT_JOIN) 
         .setResultTransformer(
         CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

回答

1

使用ProjectionList僅返回您之後的字段。

Criteria criteria = session.createCriteria(Property.class, "property") 
    .setProjection(Projections.projectionList() 
     .add(Projections.property("property.field1")) 
     .add(Projections.property("concern.field2")) 
     /*etc*/) 
    /*etc etc etc*/; 

結果是一個數組數組。

for (Object result : criteria.list()) { 
    final Object[] fields = (Object[]) result; 
    log.info("property.field1={}, concern.field2={}", fields[0], fields[1]); 
} 

順便說一句,你的實體名稱「屬性」可能導致與現有的Hibernate類的困惑/衝突,特別是因爲你使用的是標準。

+0

但是,我又需要遍歷到返回的項目,形成對象層次結構。而不是有沒有其他的方式? – Jothi 2010-08-31 11:45:49

0

,你必須使用Transformers.aliasToBean(Property.class) ..

ProjectionList properties = Projections.projectionList(); 
properties.add(Projections.property("p.id"), "id");//"id" should match with the property name to call setters 
properties.add(Projections.property("p.fname"), "fname"); 
properties.add(Projections.property("s.lname"), "lname"); 


criteria.setProjection(properties); 
criteria.setResultTransformer(Transformers.aliasToBean(Student.class)); 
List<Student> students = (List<Student>) criteria.list();