【发布时间】:2020-09-15 20:35:55
【问题描述】:
我正在尝试使用 HQL 查询 Java 对象,该对象基于它拥有的对象的 Java 映射执行过滤器。
基本上我想问的是'给我所有的错误报告,其中 mapkey1=val_x 和 mapkey2=val_y'
我有这个对象(精简)
@Entity
@Table(name = "error_report")
public class ErrorReport implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id", length=50)
private String id= UUID.randomUUID().toString();
@ElementCollection
@CollectionTable(name = "error_property", joinColumns = {@JoinColumn(name = "error_id", referencedColumnName = "id")})
@MapKeyColumn(name = "prop", length=50)
@Column(name = "prop_val")
@Type(type="text")
private Map<String, String> reportedProperties = new HashMap<>();
}
所以我想要基于reportedProperties 的ErrorReports。我已经设置了一个单元测试,当报告的Properties Map 每个 ErrorReport 只有 1 个条目时,一切正常。这是我使用的 HQL:
from ErrorReport as model where KEY(model.reportedProperties) = :A1 and VALUE(model.reportedProperties) = :A2
当 ErrorReport 在报告的Properties 映射中有 2 个条目时,查询失败并出现以下错误:
无法提取结果集 引起的 HsqlException: 违反基数
当我查看生成的 SQL 并尝试手动运行它时,我发现它不起作用,因为内部选择返回多个结果。
SELECT error_report_.id AS id1_2_, error_report_.product_url AS product_2_2_, error_report_.audit_id AS audit_id3_2_, error_report_.category_id AS
category4_2_, error_report_.error_desc AS error_de5_2_, error_report_.notifier_id AS notifier6_2_, error_report_.product_name AS
product_7_2_, error_report_.product_version AS product_8_2_, error_report_.error_time AS error_ti9_2_
FROM error_report error_report_
CROSS JOIN error_property reportedpr1_
CROSS JOIN error_property reportedpr2_
WHERE error_report_.id=reportedpr1_.error_id
AND error_report_.id=reportedpr2_.error_id
AND reportedpr1_.prop=?
AND
(SELECT reportedpr2_.prop_val FROM error_property reportedpr2_ WHERE error_report_.id=reportedpr2_.error_id)=?
显然我的 HQL 有问题,但它似乎遵循我发现的其他示例。有谁知道语法是什么?
我使用的是休眠 5.4.9.Final
【问题讨论】:
-
嗨@Agent96 想知道你解决了这个问题吗?我遇到了同样的问题并试图找出解决方案。