HHH-18898 fix of a NPE when using an embeddable with a specified JavaType

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. 🙂