【发布时间】:2021-05-27 00:15:21
【问题描述】:
我正在使用 Quarkus 和 Hibernate / Panache。
在本例中,我有 3 个表(table_a、table_b、table_c)使用本机查询连接在一起。在我正在进行的项目中,大约有 5 个JOIN 表来检索我正在寻找的信息。
table_b 纯粹是table_a 和table_c 的映射/连接表:
SELECT
a.id,
a.name,
c.login_date
FROM
table_a a
JOIN table_b b ON b.a_id = a.id
JOIN table_c c ON b.c_id = c.id
WHERE
c.login_date > '01-MAY-21'
我将以上内容移植到 HQL。我已经将我所有的@Entity 类与它们各自的@Table 以及它们的@Column 名称一起映射。我们在那个部门做得很好。
SELECT
a.id,
a.name,
c.loginDate
FROM
TableA a
JOIN TableA b ON b.aId = a.id
JOIN TableB c ON b.cId = c.id
WHERE
c.loginDate > '01-MAY-21'
我只是在寻找name 和login_date。在table_a 和table_c 中存储了许多其他信息,我不希望这些信息用于此特定查询。所以我为此调用创建了一个实体:
@Entity
@IdClass(LoginDetailsPk.class)
@NamedQuery(
name = "LoginDetails.findFromDate",
query = "FROM TableA a " +
"JOIN TableA b ON b.aId = a.id " +
"JOIN TableB c ON b.cId = c.id " +
"WHERE c.loginDate > '01-MAY-21'"
)
public class LoginDetails extends PanacheEntityBase {
@Id
private int id;
@Id
private String name;
@Id
private String loginDate;
public static List<LoginDetails> findFromDate(String fromDate) {
// Eventually pass fromDate into find()
return find("#LoginDetails.findFromDate").list();
}
}
我很难理解为什么return 甚至可以工作。当我调用LoginDetails.findFromDate(...) 并将其存储在List<LoginDetails> 中时,它工作正常。但是,当我尝试访问该列表时,我收到了 ClassCastException 错误。
List<LoginDetails> details = LoginDetails.findFromDate(null);
for(LoginDetails detail : details) { // <------ Throws a class cast exception
//...
}
调试后,我注意到存储在我的List 中的泛型类型甚至不是我的LoginDetails 类;相反,它是一个对象数组 (List<Object[]>),其中包含我所有的 @Entities 以及我不寻找的不相关信息。
我迷路了。回到原生查询是否更有意义?
【问题讨论】:
标签: java oracle hql named-query quarkus-panache