5

HibernateCriteriaAPIで苦労しています。

クラスConversationで私は持っています:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "Conversation_ConversationParticipants",
           joinColumns = @JoinColumn(name = "ConversationID"), 
           inverseJoinColumns = @JoinColumn(name = "ConversationParticipantID"))
private List<ConversationParticipant> participants;

そしてクラスConversationParticipantで私は持っています:

@OneToOne
@JoinColumn(name = "ParticipantID")
private User participant;

@Type(type = "true_false")
@Column(name = "Viewed")
private boolean viewed;

私の基準では私は持っています

    Criteria criteria = super.createCriteria();
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    criteria.createAlias("participants", "participants");  
    criteria.createAlias("participants.participant", "participant");
    criteria.add(Restrictions.eq("participant.id", user.getId()));

    return (List<Conversation>) criteria.list();

これはすべて問題なく機能し、特定のユーザーのすべての会話を見ることができます。ただし、私が欲しいのは、ユーザーがまだ表示していないすべての会話を表示することです。そうするために、私は追加しようとします:

    criteria.add(Restrictions.eq("participants.viewed", false)); 

ただし、これは0の会話を返します(「true」を入力すると同じ結果が得られ、dbをチェックして、trueとfalseの両方の値があることを確認しました)。どうすればこれを達成できますか?私は何が間違っているのですか?

実行されるクエリは次のとおりです。

from
    Conversations this_ 
inner join
    Conversation_ConversationParticipants participan4_ 
        on this_.id=participan4_.ConversationID 
inner join
    ConversationParticipants participan1_ 
        on participan4_.ConversationParticipantID=participan1_.id 
inner join
    Users participan2_ 
        on participan1_.ParticipantID=participan2_.id 
where
    participan1_.Viewed=? 
    and participan2_.id=?

DBテーブル:

 CREATE TABLE ConversationParticipants(ID BIGINT NOT NULL IDENTITY, Viewed CHAR(1), Type VARCHAR (255), ParticipantID BIGINT, PRIMARY KEY (ID));

以下の回答に基づいて、私はそれを使用することによってそれを機能させることができました:

 criteria.add(Restrictions.eq("participants.viewed", Boolean.FALSE));
4

1 に答える 1