2017-01-20 93 views
0

我想使用休眠標準api來獲取僅基於USER_ID的主題,但不知道如何使用條件來做到這一點。休眠標準一對多問題

我的表是 「topic_users」(下)

enter image description here

和 「主題」 表(如下圖)

enter image description here

我知道如何使用SQL做到這一點,這將是這樣的:

SELECT TOPICNAME 
FROM topic_users INNER JOIN topics on topic_users.TOPICS_TOPICS_ID = topics.TOPICS_ID 
WHERE topic_users.USER_ID = 1 

這將返回所有TOPICNAMEUSER_ID 1這正是我想要的,但我如何使用Hibernate Criteria來做到這一點。到目前爲止,我在我的Repository類中有這個(見下文),但是這隻會返回一個高度嵌套的JSON數組。我可以遍歷對象,使用DTO並構建我的響應,或者嘗試Hibernate createSQLQuery方法,它可以讓我直接調用本地SQL語句(還沒有嘗試過)...但我正在嘗試學習Criteria我希望任何人都可以回答我的問題。

@Repository("userTopicsDao") 
public class UserTopicsDaoImpl extends AbstractDao<Integer, UserTopics>implements UserTopicsDao { 

    @Override 
    public List<UserTopics> findMyTopics(int userId) { 
     Criteria crit = createEntityCriteria(); 
     crit.add(Restrictions.eq("userId", userId)); 
     List<UserTopics> userTopicsList = (List<UserTopics>)crit.list(); 
     return userTopicsList; 
    } 

和我TOPIC_USERS實體,我已經從地映射TOPICS

@Entity 
@Table(name="TOPIC_USERS") 
public class UserTopics { 

    @Id 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    @Column(name="TOPICUSER_ID") 
    private Integer id; 

    @Column(name="USER_ID") 
    private Integer userId; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "TOPICS_ID") 
    private Set<Topics> topicsUser; 

    //getter and setters 
+0

你可以添加Topic實體類嗎? –

回答

1

好啓動..你的實體類應該是這樣的:

@Entity 
@Table(name="TOPIC_USERS") 
public class UserTopics { 

    @Id 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    @Column(name="TOPICUSER_ID") 
    private Integer id; 

    @Column(name="USER_ID") 
    private Integer userId; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "TOPICS_TOPICS_ID") 
    private Topics topics; 

你的主題類應該看起來像這樣:

@Entity 
@Table(name="TOPICS") 
public class Topic { 

    @Id 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    @Column(name="TOPICUS_ID") 
    private Integer id; 

    @Column(name="TOPICNAME") 
    private Integer topicName; 

    @OneToMany(mappedBy = "topics") 
    private Set<UserTopics> userTopics; 

最後的標準:

1版)你得到整個實體:

Criteria c = session.createCriteria(Topics.class, "topics"); 
c.createAlias("topics.userTopics", "userTopics"); 
c.add(Restrictions.eq("userTopics.userId", userId)); 
return c.list(); // here you return List<Topics> 

第2版)你的項目只有topicname:

Criteria c = session.createCriteria(Topics.class, "topics"); 
c.createAlias("topics.userTopics", "userTopics"); 
c.add(Restrictions.eq("userTopics.userId", userId)); 
c.setProjection(Projections.property("topics.topicName")); 
List<Object[]> results = (List<Object[]>)c.list(); 

// Here you have to manually get the topicname from Object[] table. 

}

+0

Spot On,嘗試了你的建議,它像一個魅力一樣工作。當你來到都柏林時,大量的吉尼斯爲你服務。 – user2342259

+0

我已經接近在那裏得到一份合同,但最終留在倫敦..下次! –