Я пытаюсь запросить объект 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