Comment puis-je utiliser CriteriaBuilder à écrire une jointure externe gauche lorsque la relation va dans l'autre sens?

Je suis en utilisant JPA 2.0, Hibernate 4.1.0.Final et MySQL 5.5.37. J'ai les deux entités ...

@Entity
@Table(name = "msg")
public class Message
{

    @Id
    @NotNull
    @GeneratedValue(generator = "uuid-strategy")
    @Column(name = "ID")
    private String id;

    @Column(name = "MESSAGE", columnDefinition="LONGTEXT")
    private String message;

et

@Entity
@Table(name = "msg_read", uniqueConstraints = { @UniqueConstraint(columnNames = { "MESSAGE_ID", "RECIPIENT" }) })
public class MessageReadDate
{

    @Id
    @NotNull
    @GeneratedValue(generator = "uuid-strategy")
    @Column(name = "ID")
    private String id;

    @ManyToOne
    @JoinColumn(name = "RECIPIENT", nullable = false, updatable = true)
    private User recipient;

    @ManyToOne
    @JoinColumn(name = "MESSAGE_ID", nullable = false, updatable = true)
    private Message message;

    @Column(name = "READ_DATE")
    private java.util.Date readDate;

À l'aide de CriteriaBuilder, comment pourrais-je écrire ce

SELECT DISTINCT m.*
FROM msg AS m
LEFT JOIN msg_read AS mr
        ON mr.message_id = m.id AND mr.recipient = 'USER1'

? Mon problème est que il n'y a pas de champ “msg_read” dans mon Message de l'entité, et je ne suis pas sûr de la façon de spécifier le “ET” de la jointure externe gauche dans CriteriaBuilder.

Ne mr.recipient = 'USER1' travail de toute façon?
Le ON la clause peut être utilisée pour ajouter des conditions supplémentaires à la condition de jointure qui fait partie de la JPA 2.1. Par conséquent, il est uniquement disponible en mode veille prolongée 4.3.x et au-delà, sauf si vous utilisez plaine Hibernate qui prend en charge la with clause pour la même chose.

OriginalL'auteur Dave | 2014-09-11