Hibernate别名为一个简单的布尔字段

时间:2012-12-26 21:08:29

标签: hibernate alias 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;

在班级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));

1 个答案:

答案 0 :(得分:3)

你要做的事情在理论上是正确的,应该有效。然而,我正在考虑一些可能被证明是错误的可能事情:

  1. 确保正确使用您的吸气剂和定位器。您的代码应如下所示:

    private boolean viewed;
    
    @Type(type = "true_false")
    @Column(name = "Viewed")
    public boolean isViewed() {
        return viewed;
    }
    
    public void setViewed(boolean viewed) {
        this.viewed = viewed;
    } 
    
  2. 确保您的数据库字段是BIT(或您正在使用的数据库上布尔值的相应数据类型)。

  3. 如果 1 2 都不起作用,我建议删除@Type注释,因为它没有必要,尽管它不会造成任何伤害。

  4. 修改

    您正尝试将boolean映射到char。我真的不明白为什么你会使用char(1)代替BIT。但是,如果您想这样做,请在模型类中使用String

    然后,如果您的数据库列包含 0 1 ,请使用:

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

    或者,如果您的数据库列包含 true / false ,请使用:

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