Hibernate查询版本的复合选择

时间:2014-01-31 23:29:41

标签: java mysql sql hibernate

我有以下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中我可以这样做:     select * from Person p,ProjectParticipants r其中p.id = r.person_id和r.project_id = and p.company_id =;

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

然而,似乎使用hibernate查询对象,除非我实例化公司,否则这不起作用。有没有办法进行此查询而无需从其id实例公司对象?

1 个答案:

答案 0 :(得分:0)

“公司实例”是什么意思?对于此对象结构和(缺少)映射,您可以与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但看起来不同。