La combinación izquierda de la especificación JPA no devuelve todos los objetos

Tengo un problema interesante con la combinación izquierda usando las especificaciones JPA y no pude encontrar una respuesta en publicaciones similares. Parece que no todas las filas en un resultado SQL se convierten en una entidad Java.

Estoy usando Hibernate y Spring Data con las siguientes entidades:

public enum LinkTypeEnum {
    DEFAULT,
    SUPER,
    TREE
}
// Each LinkTypeEnum value has a separate row in a database. Always.
@Entity
public class LinkType {
    @Id
    private String id;

    @Enumerated(EnumType.STRING)
    private LinkTypeEnum linkType;

    // Simple getters and setters for each field
}
@Entity
public class Master {
    @Id
    private String id;

    private String title;

    @ManyToOne
    private LinkType type;

    // Simple getters and setters for each field
}

Ahora, lo que estoy tratando de lograr es seleccionar todas las entidades maestras que están asociadas con la entidad LinkType que tiene un valor de enumeración específico (el usuario puede proporcionar más). Pero si la entidad maestra tiene NULL en la columna de tipo, debe tratarse como si estuviera vinculada a un LinkType con la enumeración DEFAULT como reserva.

Pensé que COALESCE e IN serían geniales aquí:

public static Specification<Master> withTypes() {
    return (root, query, cb) -> {
        final Join<Master, LinkType> join = root.join("type", JoinType.LEFT);

        return
                cb.coalesce(join.get("linkType"), LinkTypeEnum.DEFAULT)
                        .in(List.of(LinkTypeEnum.DEFAULT));
    };
}

Mis datos de muestra se ven así:

table link_type:
id            link_type
-------------------------
type-default  DEFAULT
type-super    SUPER
type-tree     TREE

table master:
id        title   type_id
-------------------------
master-1  A       type-default
master-2  B       NULL
master-3  C       type-super

Pero esto no devuelve un objeto de entidad maestra sin asociación (valor NULL en el tipo de columna). La consulta anterior solo devuelvemaster-1

Aunque la consulta SQL generada se ve bien. Porque cuando lo ejecuto en una consola de base de datos, devuelve las filas maestras correctas.

select
  master0_.id as id1_1_,
  master0_.title as title2_1_,
  master0_.type_id as type_id3_1_

from master master0_

left outer join link_type linktype1_ on master0_.type_id=linktype1_.id

where coalesce(linktype1_.link_type, 'DEFAULT') in ('DEFAULT', 'SUPER')

Entonces, ¿tal vez hay algún truco en Hibernate que impide la creación de la segunda entidad? No tengo ni idea y actualmente no tengo idea de dónde buscar en una documentación.

Muchísimas gracias.

Answer