我正在努力使用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;
在班级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个会话(如果我把&#39; true&#39;我得到相同的结果,我检查了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=?
数据库表:
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));
答案 0 :(得分:3)
你要做的事情在理论上是正确的,应该有效。然而,我正在考虑一些可能被证明是错误的可能事情:
确保正确使用您的吸气剂和定位器。您的代码应如下所示:
private boolean viewed;
@Type(type = "true_false")
@Column(name = "Viewed")
public boolean isViewed() {
return viewed;
}
public void setViewed(boolean viewed) {
this.viewed = viewed;
}
确保您的数据库字段是BIT
(或您正在使用的数据库上布尔值的相应数据类型)。
如果 1 和 2 都不起作用,我建议删除@Type
注释,因为它没有必要,尽管它不会造成任何伤害。
修改强>
您正尝试将boolean
映射到char
。我真的不明白为什么你会使用char(1)
代替BIT
。但是,如果您想这样做,请在模型类中使用String
。
然后,如果您的数据库列包含 0 或 1 ,请使用:
criteria.add(Restrictions.eq("participants.viewed", "0"));
或者,如果您的数据库列包含 true / false ,请使用:
criteria.add(Restrictions.eq("participants.viewed", "false"));