【问题标题】:Convert a SQL query to Hibernate Criteria将 SQL 查询转换为 Hibernate Criteria
【发布时间】:2011-12-24 20:39:09
【问题描述】:


我正在处理的场景类似于 twitter。我想要做的是使用休眠标准 API 获取关注用户的雕像。
使用的类:
User(这个类与自身具有多对多关系,由下表映射)
Status(这个有一个用户的外键)
如果我要用普通的旧 sql 编写它,那就是它。

select * from status where status.user_id IN(select follow_id from follow where follow.user_id = 1)

如何使用 Hibernate Criteria API 实现这个结果?

@javax.persistence.Table(name = "user", uniqueConstraints = {
        @UniqueConstraint(columnNames = "user_name")})
@Entity
public class TweeUser implements Serializable {
    private int id;

    @javax.persistence.Column(name = "id")
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    private String userName;

    @Column(name = "user_name")
    @Basic
    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    private String fullName;

    @javax.persistence.Column(name = "full_name")
    @Basic
    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    private String email;

    @javax.persistence.Column(name = "email")
    @Basic
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    private String password;

    @javax.persistence.Column(name = "password")
    @Basic
    public String getPassword() {
        return password;
    }

    private Set<TweeUser> followingUsers;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "follow", joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "follow_id")},
            uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "follow_id"})})

    public Set<TweeUser> getFollowingUsers() {
        return followingUsers;
    }

    public void setFollowingUsers(Set<TweeUser> followingUsers) {
        this.followingUsers = followingUsers;
    }
}

状态实体

@javax.persistence.Table(name = "status")
    @Entity
    public class TweeStatus implements Serializable{
        private int id;

        @javax.persistence.Column(name = "id")
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        private String rawStatus;

        @javax.persistence.Column(name = "raw_status")
        @Basic
        public String getRawStatus() {
            return rawStatus;
        }

        public void setRawStatus(String rawStatus) {
            this.rawStatus = rawStatus;
        }

        private Date createTime;

        @Temporal(TemporalType.TIMESTAMP)
        @javax.persistence.Column(name = "create_time")
        @Basic
        public Date getCreateTime() {
            return createTime;
        }

        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }

        private TweeUser tweeUser;

        @ManyToOne
        @JoinColumn(name = "user_id")
        public TweeUser getTweeUser(){
            return tweeUser;
        }

        public void setTweeUser(TweeUser tweeUser){
            this.tweeUser = tweeUser;
        }

        private Set<TweeHashTag> tweeHashTags;

        @ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
        @JoinTable(name = "status_hash", joinColumns = { @JoinColumn(name = "status_id") }, inverseJoinColumns = { @JoinColumn(name = "hash_id")},uniqueConstraints = {
            @UniqueConstraint( columnNames = { "status_id", "hash_id" } ) })
        public Set<TweeHashTag> getTweeHashTags(){
            return tweeHashTags;
        }

        public void setTweeHashTags(Set<TweeHashTag> tweeHashTags){
            this.tweeHashTags = tweeHashTags;
        }

    }

【问题讨论】:

    标签: hibernate criteria-api


    【解决方案1】:

    您未能提供实体的代码。如果您这样做,也许我们可以为您提供更好的帮助。 我最初的想法是,拥有一个与自身具有@ManyToMany 关系的实体通常不是一个好主意。 我的第一个建议是看看这篇文章,也许重新考虑你的数据库设计:

    How to define many-to-many to itself in JPA?

    【讨论】:

    • 我已经添加了来源。好吧,我已经对用户实体做了一些操作。所以不知道我是否能够改变设计。但我也会看的。如果你能指出我必须做的改变,我会很高兴。
    【解决方案2】:

    我想我得到了这个问题的答案。这相当简单。就这样吧。

    Criteria criteria = session.createCriteria(TweeStatus.class);
    criteria.add(Restrictions.in("tweeUser",tweeUser.getFollowingUsers()));
    List statuses = criteria.list();
    

    【讨论】:

      猜你喜欢
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 2015-10-10
      • 2010-12-04
      • 2021-09-15
      • 2014-10-08
      • 1970-01-01
      相关资源
      最近更新 更多