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));