【问题标题】:Hibernate Query version of Compound select复合选择的休眠查询版本
【发布时间】:2014-01-31 23:29:40
【问题描述】:

我有以下 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 where p.id=r.person_id and 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>;

但是,除非我实例化公司,否则使用休眠查询对象似乎无法正常工作。有没有办法进行此查询,而不必从其 id 实例化公司对象?

【问题讨论】:

    标签: java mysql sql hibernate


    【解决方案1】:

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

    【讨论】:

    • 是的,谢谢,我不是 HQL 方面的专家,我只是想你可以像示例中那样表达对象的 id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多