Преобразование SQL-запроса в критерии гибернации

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

    }

person sYl3r    schedule 24.12.2011    source источник


Ответы (2)


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

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

person Nikola Yovchev    schedule 24.12.2011
comment
Я добавил источники. Что ж, я уже проделал несколько операций с сущностью User. Так что не знаю, смогу ли я изменить дизайн. Но я тоже посмотрю на это. И я был бы рад, если вы укажете мне, какие изменения мне нужно сделать. - person sYl3r; 25.12.2011

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

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