2015-07-18 9 views
0

讓我們說,我們有兩個表:部門EMP如何使用Hibernate的選擇標準只有父表中的列,而不是子表

現在我需要使用Hibernate的標準,這樣的語句:

select d. from dept d, emp e 
where d.id=e.dept_id 
and d.name='HR' and e.age>25; 

我嘗試以下操作:

 Session session = (Session) getEntityManager().getDelegate(); 
    Criteria criteria = session.createCriteria(Dept.class, "d"); 
    criteria.createAlias("emp", "e"); 
    criteria.add(Restrictions.like("d.name", name)); 
    criteria.add(Restrictions.ge("e.age", age)); 
    List<Dept> results = criteria.list(); 

但是這給了我這個查詢輸出:
select d.* ,e.* from(而不是d.*

任何人都可以提供幫助嗎?

+0

你可以通過使用'setProjection()'方法來設置投影,從'Dept'中選擇列。所以你的查詢將是'select d.id,d.name from ...' – Amogh

+0

父表有許多列。應該有一個很好的方法來做到這一點。我找不到一個,但可能應該有一個。預測可以選擇幾列。 – Ankush

回答

0

通過考慮Dept具有性能id,name,您可以使用setProjection()選擇Dept表列,

Session session = (Session) getEntityManager().getDelegate(); 
Criteria criteria = session.createCriteria(Dept.class, "d"); 
criteria.createAlias("emp", "e"); 
criteria.setProjection(Projections.projectionList() 
    .add(Projections.property("d.id"), "id") 
    .add(Projections.property("d.name"), "name")); 
criteria.add(Restrictions.like("d.name", name)); 
criteria.add(Restrictions.ge("e.age", age)); 
criteria.setResultTransformer(new AliasToBeanResultTransformer(Dept.class)) 
List<Dept> results = criteria.list(); 

更新

或者你可以使用HQL爲:

select d from Dept d inner join d.emp

所以你的代碼將會是:

String hql = "select d from Dept d inner join d.emp"; // add additional where clause 
Query query = session.createQuery(hql); 
List<Dept> listDepts = query.list(); 
+0

父表有許多列。應該有一個很好的方法來做到這一點。我找不到一個,但可能應該有一個。預測可以選擇幾列。 – Ankush

+0

@Ankush你可以使用HQL(因爲Criteria API使用HQL)在這種情況下,請參閱更新部分的答案 – Amogh

+0

是的,我可以使用HQL,但我更感興趣的標準之一。有沒有一種方法可以使用標準。我認爲兩者的表現都是相同的,只是標準理解起來很簡潔,並且具有良好的可讀性。 – Ankush

相關問題