java - 复合选择的 Hibernate 查询版本

标签 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 中我可以这样做: 从人员 p、项目参与者 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>;

但是,似乎要使用 hibernate 查询对象,除非我实例化公司,否则这无法工作。有没有一种方法可以进行此查询,而无需从其 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,但看起来有所不同。

关于java - 复合选择的 Hibernate 查询版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21491981/

相关文章:

sql - 以类似 Excel 的方式在 MySQL 中对 varchar 列进行排序

java - java中动态创建新对象

java - 如何删除android布局中的图片

java - 将请求范围数据传递给 CDI 中的异步方法

mysql - 在 MS SQL Server mgt studio 中,有没有办法格式化选择结果,如 mysql\G

php - 允许基于特定格式的单独私有(private)IP的mysql连接

php - 使用示例数据但不使用自定义数据的 Google 图表

sql - 在 Spark SQL 中查找表大小(以 MB/GB 为单位)

java - 安卓编程;得到一个小错误

python - 在 Django 中使用 DateTimeField 与 Oracle