Прежде всего, при написании запросов с помощью 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]));
}