In https://hibernate.atlassian.net/browse/HHH-18898 wurde ein Bug bei der Verwendung eines Embeddables eingemeldet.
Hier ein einfaches Beispiel, bei der die EntityEmbedNative die EmbedNative einbindet.
@Embeddable
public static class EmbedNative {
@Column(name = "DATUM")
@JavaType(LocalDateJavaType.class)
LocalDate value;
}
@Entity(name = "EntityEmbedNative")
public static class EntityEmbedNative {
@Id
@Column(name = "id")
long id;
@Embedded
EmbedNative embedNative;
}
Link zur Embeddable-Annotation:
https://docs.hibernate.org/orm/7.2/userguide/html_single/#embeddables
Wenn man folgende Select-Statements ausführt, sieht man dass bei zweien eine NullPointerException auftritt:
"select z from EntityEmbedNative z where embedNative.value=:datum",
"select z from EntityEmbedNative z where :datum=embedNative.value",
"select z from EntityEmbedNative z where embedNative=:datum", // this query failed with the bug
"select z from EntityEmbedNative z where :datum=embedNative",
"select z from EntityEmbedNative z where embedNative.value in (:datum)",
"select z from EntityEmbedNative z where embedNative in (:datum)" // failed as well
Anzumerken ist, dass das dritte, vierte und sechste Query aber ohnehin nur funktionieren kann, wenn das Embeddable-Objekt nur eine Feld hat (was im oberen Beispiel gegeben ist).
Interessanterweise wird die NullPointerException aber nur geworfen, wenn das Argument auf der rechten Seite der Expression steht, nicht aber wenn es auf der linken Seite steht wie es im vierten Query auch der Fall ist.
Hier geht’s zum vollständigen Reproducer-Test:
https://github.com/peter1123581321/hibernate-test-case-templates/blob/HHH-18898/orm/hibernate-orm-6/src/test/java/org/hibernate/bugs/HHH18898Test.java
Der Bug konnte durch zwei Null-Checks in der Klasse AbstractSqlAstTranslator schnell gefixt werden.
Hier der Pull-Request:
https://github.com/hibernate/hibernate-orm/pull/10235
Der Bug wurde ursprünglich nicht für native Datentypen eingemeldet sondern in Kombination mit der @JavaType-Annotation. Außerdem ist mir während dem Bugfixing auch aufgefallen, dass das Problem auch bei Listen mit dem IN-Operator auftritt. Somit wurde der Bug eigentlich für 4 unterschiedliche Szenarien gefixt. 🙂
