2017-01-20 2 views
0

Ich versuche, Hibernate Criteria api zu verwenden, um nur die Themen basierend auf dem abzurufen, habe aber keine Idee, wie man es unter Verwendung der Kriterien macht.Hibernate-Kriterien Eins zu viele Probleme

Meine Tabellen sind "topic_users" (unten)

enter image description here

und "Themen" Tabelle (unten)

enter image description here

Ich weiß, wie es tun SQL verwenden, würde dies sei etwas wie:

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

Das gibt alle TOPICNAME von USER_ID 1 zurück, was genau das ist, was ich will, aber wie ich das mit Hibernate Criteria machen kann. Bisher habe ich dies in meiner Repository-Klasse (siehe unten), aber dies wird nur ein hoch verschachteltes JSON-Array zurückgeben. Ich könnte die Objekte durchlaufen, ein DTO verwenden und meine Antwort erstellen oder die Hibernate-Methode createSQLQuery ausprobieren, mit der ich eine native SQL-Anweisung direkt aufrufen kann (habe das noch nicht versucht) ... aber ich versuche, die Kriterien so zu lernen Ich hoffe, dass jemand meine Frage beantworten kann.

@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; 
    } 

und meine TOPIC_USERS Entity, wo ich die Sie Entitätsklassen 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

Können Sie die Topic-Entitätsklasse hinzufügen? –

Antwort

1

Ok, ausgehend von dem Boden .. oben abgebildet haben sollte wie folgt aussehen:

@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; 

Ihre Themen Klasse sollte so aussehen:

@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; 

schließlich die Kriterien:

Version 1) Sie erhalten ganze Einheit:

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> 

Version 2) Sie projizieren nur die 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, versuchte, was Sie vorgeschlagen und es funktionierte wie ein Charme. Ein großes Pint Guinness für Sie, wenn Sie nach Dublin fahren. – user2342259

+0

Ich war kurz davor, einen Vertrag zu bekommen, aber landete in London. Das nächste Mal! –