Bor*_*vat 4 alias hibernate criteria restrictions
我正在努力使用 Hibernate Criteria API。
在课堂上Conversation
我有:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "Conversation_ConversationParticipants",
joinColumns = @JoinColumn(name = "ConversationID"),
inverseJoinColumns = @JoinColumn(name = "ConversationParticipantID"))
private List<ConversationParticipant> participants;
Run Code Online (Sandbox Code Playgroud)
在课堂上ConversationParticipant
我有:
@OneToOne
@JoinColumn(name = "ParticipantID")
private User participant;
@Type(type = "true_false")
@Column(name = "Viewed")
private boolean viewed;
Run Code Online (Sandbox Code Playgroud)
在我的标准中,我有
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();
Run Code Online (Sandbox Code Playgroud)
这一切正常,我可以看到给定用户的所有对话。但是,我想要的是查看用户尚未查看的所有对话。为此,我尝试添加:
criteria.add(Restrictions.eq("participants.viewed", false));
Run Code Online (Sandbox Code Playgroud)
但是,这会返回 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=?
Run Code Online (Sandbox Code Playgroud)
数据库表:
CREATE TABLE ConversationParticipants(ID BIGINT NOT NULL IDENTITY, Viewed CHAR(1), Type VARCHAR (255), ParticipantID BIGINT, PRIMARY KEY (ID));
Run Code Online (Sandbox Code Playgroud)
根据下面的答案,我能够使用以下方法使其工作:
criteria.add(Restrictions.eq("participants.viewed", Boolean.FALSE));
Run Code Online (Sandbox Code Playgroud)
您尝试做的事情在理论上是正确的,应该可以工作。尽管如此,我正在考虑一些可能被证明是错误的事情:
确保你的 getter 和 setter 被正确使用。您的代码应如下所示:
private boolean viewed;
@Type(type = "true_false")
@Column(name = "Viewed")
public boolean isViewed() {
return viewed;
}
public void setViewed(boolean viewed) {
this.viewed = viewed;
}
Run Code Online (Sandbox Code Playgroud)确保您的 DB 字段是 a BIT
(或您正在使用的 DB 上布尔值的相应数据类型)。
如果1和2 都不起作用,我建议删除@Type
注释,因为它没有必要,尽管它应该没有害处。
编辑:
您正在尝试将 a 映射boolean
到 a char
。我真的不明白为什么你会使用 achar(1)
而不是 a BIT
。不过,如果您想这样做,请使用String
模型类中的 a。
然后,如果您的 DB 列包含0或1,请使用:
criteria.add(Restrictions.eq("participants.viewed", "0"));
Run Code Online (Sandbox Code Playgroud)
或者,如果您的数据库列包含true/false,请使用:
criteria.add(Restrictions.eq("participants.viewed", "false"));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16882 次 |
最近记录: |