Запрос гибернации для сущностей, имеющих отношение oneToMany (используя подзапрос в операторе select) - PullRequest
0 голосов
/ 01 июня 2019

Я новичок в hibernate и хочу создать следующий запрос, используя hibernate

рабочий sql:

select * , (select count(*) from likes as li where q.ques_id= li.ques_id) as likes_Count from question as q where q.subcategory_id =1)

, но не могу обойтись для hibernate.

Я написал метод в своем классе DAOImpl, но не работает, когда я использую подзапрос для COUNT.

public List<Question> mcqsListByPage(int subCatId, int pagenumber, int pagesize) {

      String query = "select * , (select count(*) from mc.userLikes as l where qs.qs_id= l.qs_id) as count1 FROM Question qs JOIN qs.userLikes AND qs.subCategory = :catId";
        try {
            return sessionFactory.getCurrentSession().createQuery(query, Question.class)
                    .setParameter("catId", subCatId)
                    .setFirstResult((pagenumber - 1) * pagesize)
                    .setMaxResults(pagesize)
                    .getResultList();

        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

У меня есть два объекта с одним выпуском onetomany

public class Question{

       @Column(name = "subcategory_id")
    private int subCategory;

        @OneToMany(mappedBy = "qs_id", fetch = FetchType.EAGER)
    private List<Likes> userLikes = new ArrayList<Likes>();
    }


public class Likes{

        @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private int id;

        @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "QS_ID")
    private Question qs   ;
}

Я хочу вернутьсписок вопросов вместе с количеством лайков для каждого вопроса в Списке <> с использованием hibernate.

1 Ответ

0 голосов
/ 01 июня 2019

Прежде всего, при написании запросов с помощью Hibernate вам необходимо забыть о понятиях вашей базы данных, таких как столбцы и *.С Hibernate вы запрашиваете свои сущности (классы Java).

Поскольку ваш список Likes загружается с нетерпением, вы можете сделать что-то простое:

public List<Question> getQuestionsForSubcategory(final int subcategory) {
    final TypedQuery<Question> query = 
        em.createQuery("select q from Question q where q.subCategory = :subcategory", Question.class);
    query.setParameter("subcategory", subcategory);
    return query.getResultList();
}

Затем вы можетеиспользуйте этот список, чтобы создать структуру, содержащую число лайков:

public Map<Question, Integer> getLikesPerQuestion() {
    final List<Question> questions = getQuestionsForSubcategory(1);
    return questions.stream()
                    .collect(Collectors.toMap(q -> q, q -> q.getUserLikes().size()));

Если список Likes был отложен, это снизило бы производительность, и конкретный запрос был бы лучше.

Если вы хотите сделать это с одним запросом к базе данных, довольно сложно (невозможно?) Объединить запрос для объекта с пользовательским столбцом.Но вы могли бы сделать что-то вроде этого:

public Map<Integer, Long> getQuestionIdToNumberOfLikes() {
    TypedQuery<Object[]> query = 
         em.createQuery("SELECT q.id, count(ul) FROM Question q JOIN t.userLikes ul GROUP BY q.id", Object[].class);
         return query.getResultList()
                     .stream()
                     .collect(Collectors.toMap(o -> (Integer) o[0], o -> (Long) o[1]));

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...