java - Querydsl:如何向下转换连接实体?

标签 java querydsl

我正在寻找一种在一对多关系上进行联接的方法,其中多方是通过继承定义的,而联接的右侧部分仅限于特定的子类(向下转型)。

假设我有以下实体(示例取自 here ):

@Entity
public class Project {
  @Id
  @GeneratedValue
  private long id;
  private String name;
  @OneToMany(cascade = CascadeType.ALL)
  private List<Employee> employees;
    .............
}
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
@DiscriminatorColumn(name = "EMP_TYPE")
public class Employee {
  @Id
  @GeneratedValue
  private long id;
  private String name;
    .............
}
@Entity
@DiscriminatorValue("F")
public class FullTimeEmployee extends Employee {
  private int annualSalary;
    .............
}
@Entity
@DiscriminatorValue("P")
public class PartTimeEmployee extends Employee {
  private int weeklySalary;
    .............
}
@Entity
@DiscriminatorValue("C")
public class ContractEmployee extends Employee {
  private int hourlyRate;
    .............
}

我可以轻松构建涉及父类(super class) Employee 中定义的属性的联接查询,例如:

JPAQuery query = ...
QProject project = new QProject("p");
QEmployee employee = new QEmployee("e");
query.join(project.employees, employee);
query.where(employee.name.startsWith("A"));

但是,如果我想访问子类的属性,例如 FullTimeEmployee.annualSalary,从而将连接限制为该子类型,我该怎么做?

如何构建与以下 JPQL 等效的内容:

SELECT DISTINCT p FROM Project p JOIN TREAT(p.employees AS FullTimeEmployee) e WHERE e.annualSalary > 100000

最佳答案

你可以这样做:

EntityManager em = ...;
QProject p = QProject.project;
QFullTimeEmployee e = QFullTimeEmployee.fullTimeEmployee;
List<FullTimeEmployee> emps = new JPAQuery<>(em)
    .select(p)
    .distinct()
    .from(p)
    .innerJoin(p.employees, e._super)
    .where(e.annualSalary.gt(100000))
    .fetch();

另请参阅 Querydsl 论坛上的这篇文章:https://groups.google.com/d/msg/querydsl/4G_ea_mQJgY/JKD5lRamAQAJ

关于java - Querydsl:如何向下转换连接实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57724240/

相关文章:

java - 集合上的 QueryDSL -> 字符串列表的任何()

QueryDSL:加入子查询

java - 第一次在 Spring 上使用 QueryDSL MongoDB

java - PHP/Java for Android 之间的数据编码/解码

java - 如何在 Java 中处理 RAM 中的大量数据/图像?

java swing关闭窗口而不退出应用程序

使用 Robolectric 3.6.1 时出现 java.lang.IllegalAccessError

android - 在 Android 中使用 SQL 查询生成器库/框架

java - 在 querydsl 中调用 mysql 嵌套/内部函数

java - vector 似乎不包含正确的数据