簡體   English   中英

復合選擇的Hibernate查詢版本

[英]Hibernate Query version of Compound select

我有以下Java類:

class Person {
   private long id;
   private String firstName;
   private String lastName;
   private Company company;
   ...
}

class Company{
   private long id;
   private String name;
   private String Country;
   private long sector_id;
   ...
}

class ProjectParticipants {
   private long id;
   private long project_id;
   private long person_id;
}

如果我想選擇特定公司的所有人,我可以做:

List<Person>=session.createQuery("from Person where company_id:companyId").setLong("companyId",companyId).list();

如果我想查找特定公司的特定項目的項目參與者,則可以在SQL中執行以下操作:從Person p,ProjectParticipants r中選擇*,其中p.id = r.person_id和r.project_id =和p.company_id = ;

要么

select * from Person where id in (select person_id from ProjectParticipants where project_id=<project_id>) and company_id=<company_id>;

但是,似乎除非使用公司實例,否則使用休眠查詢對象將無法正常工作。 有沒有一種方法可以執行此查詢而不必從其ID實例化公司對象?

“實例公司”是什么意思? 對於此對象結構和(不存在)映射,您可以與SQL並行進行:

select p from Person p where p.companyId=:companyId and p.id in (select pp.personId from ProjectParticipant pp where pp.projectId=:projectId)

Query q = em.createQuery("select p from Person p where p.companyId=:companyId and p.id in (select pp.personId from ProjectParticipant pp where pp.projectId=:projectId)");
q.setParameter("companyId", 2L);
q.setParameter("projectId", 1L);
List resultList = q.getResultList();

但這根本不是用Java建模多對多關系的方式,當然,對於映射關系,查詢看起來會有所不同。 Hibernate是將有用的業務對象結構映射到關系數據庫的映射器。 這就是為什么您的第一個SQL變體(帶有手動連接)不會將1:1轉換為HQL / JPQL,而是看起來有所不同的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM