Преобразовать запрос SQL в Критерии гибернации - PullRequest
0 голосов
/ 25 декабря 2011

Привет
Сценарий, над которым я работаю, похож на твиттер. То, что я хочу сделать, это получить статуи подписанных пользователей, используя 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;
        }

    }

Ответы [ 2 ]

1 голос
/ 25 декабря 2011

Я думаю, что получил ответ на этот вопрос. Это было довольно просто. Итак, вот и все.

Criteria criteria = session.createCriteria(TweeStatus.class);
criteria.add(Restrictions.in("tweeUser",tweeUser.getFollowingUsers()));
List statuses = criteria.list();
1 голос
/ 25 декабря 2011

Вы не предоставили код своей организации. Если вы это сделаете, может быть, мы можем помочь вам лучше. Мои первые мысли заключаются в том, что вообще не очень хорошая идея иметь сущность с отношениями @ManyToMany к себе. Мое первое предложение - взглянуть на этот пост и, возможно, пересмотреть свой дизайн БД:

Как определить многие-ко-многим себе в JPA?

...