当关系相反时,如何使用CriteriaBuilder编写左外部联接?

Dav*_*ave 7 jpa criteria builder left-join jpa-2.0

我正在使用JPA 2.0,Hibernate 4.1.0.Final和MySQL 5.5.37。我有以下两个实体...

@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;
Run Code Online (Sandbox Code Playgroud)

@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;
Run Code Online (Sandbox Code Playgroud)

使用CriteriaBuilder,我该怎么写

SELECT DISTINCT m.*
FROM msg AS m
LEFT JOIN msg_read AS mr
        ON mr.message_id = m.id AND mr.recipient = 'USER1'
Run Code Online (Sandbox Code Playgroud)

?我的问题是我的Message实体中没有字段“ msg_read”,而且我不确定如何在CriteriaBuilder中指定左外部联接的“ AND”部分。

Dee*_*ava 7

你可以做这样的事情。

final Root<Message> messageRoot = criteriaQuery.from(Message.class);
Join<Message, MessageReadDate> join1 = messageRoot .join("joinColumnName", JoinType.LEFT);

Predicate predicate = criteriaBuilder.equal(MessageReadDate.<String> get("recipient"), recepientValue;
criteria.add(predicate);
criteriaQuery.where(predicate);
criteriaQuery.distinct(true);
Run Code Online (Sandbox Code Playgroud)

我希望这能解决您的疑问。

  • 嗨,您正在重申我的问题 - 我不能使用子句 'messageRoot .join("joinColumnName"' 因为我没有来自 Message -&gt; MessageReadDate 的“joinColumn”名称,只能使用其他方法。这就是我正在努力克服的问题。 (5认同)