Запрос Hibernate для объекта на основе пар ключ-значение карты Java объекта - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь запросить объект Java, используя HQL, который выполняет фильтры на основе карты 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<>();

   }

Итак, я хочу ErrorReports, основанные на сообщенных свойствах. Я настроил модульный тест, и все работает отлично, когда в поле reportProperties Map есть только одна запись на ErrorReport. Это тот HQL, который я использовал:

 from ErrorReport as model where KEY(model.reportedProperties) = :A1 and VALUE(model.reportedProperties) = :A2 

Когда ErrorReport имеет 2 записи в сообщенииProperties Map, запрос завершается со следующей ошибкой:

не удалось извлечь ResultSet, вызванный 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 что-то не так, но он, похоже, следует другим найденным мной примерам. Кто-нибудь знает, что такое синтаксис?

Я использую hibernate 5.4.9.Final

...