2017-01-20 1 views
0

Я пытаюсь использовать Hibernate Criteria 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. Пока у меня это в моем классе репозитория (см. Ниже), но это приведет только к возврату сильно вложенного массива JSON. Я мог бы прокручивать объекты, использовать DTO и строить свой ответ или попробовать метод Hibernate createSQLQuery, который позволит мне напрямую вызвать собственный SQL-запрос (еще не пробовал) ... но я пытаюсь изучить критерии так Надеюсь, кто-нибудь сможет ответить на мой запрос.

@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 Entity, где я нанес на карту 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

Можете ли вы добавить класс объекта «Тема»? –

ответ

1

Ok начиная с нуля .. вы классы сущностей должны выглядеть следующим образом:

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

Наконец критерии:

Version 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> 

Version 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

Я был близок к заключению контракта, но в конечном итоге остался в Лондоне .. в следующий раз! –

Смежные вопросы