【问题标题】:Hibernate Query for Object based on key value pairs of the Object's Java Map<String, String>基于 Object 的 Java Map<String, String> 的键值对的 Object 的 Hibernate 查询
【发布时间】: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 想知道你解决了这个问题吗?我遇到了同样的问题并试图找出解决方案。

标签: java hibernate hql


【解决方案1】:

对于以后的任何人,我都有类似的问题,并通过在集合表上应用连接并结合 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 是值。还需要DISTINCT,因为由于地图,它为我返回了重复的记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2018-09-22
    • 1970-01-01
    • 2020-08-01
    • 2020-01-26
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    相关资源
    最近更新 更多