gpt4 book ai didi

java - 基于对象的 Java Map 的键值对的对象的 Hibernate 查询

转载 作者:行者123 更新时间:2023-12-04 17:28:04 24 4
gpt4 key购买 nike

我正在尝试使用 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。我已经设置了一个单元测试,当报告的属性映射每个错误报告只有 1 个条目时,一切正常。这是我使用的 HQL:
 from ErrorReport as model where KEY(model.reportedProperties) = :A1 and VALUE(model.reportedProperties) = :A2 

当 ErrorReport 在报告的属性映射中有 2 个条目时,查询失败并显示以下错误:

could not extract ResultSet caused by HsqlException: cardinality violation



当我查看生成的 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 有问题,但它似乎遵循我发现的其他示例。有谁知道语法是什么?

我正在使用 hibernate 5.4.9.Final

最佳答案

对于将来的任何人,我都遇到了类似的问题,并通过在集合表上结合 INDEX() 应用连接来解决它。

SELECT DISTINCT(model.id), model.product_url, ...
FROM ErrorReport as model

...

JOIN model.reportedProperties rProp
WHERE INDEX(rProp) = :A1 AND rProp = :A2
这里 INDEX(rProp)是关键和 rProp是值(value)。还有 DISTINCT需要它,因为由于 map ,它为我返回了重复的记录。

关于java - 基于对象的 Java Map<String, String> 的键值对的对象的 Hibernate 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62066225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com