Вы можете использовать запрос критериев кортежа :
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tuple> criteria = builder.createTupleQuery();
Root<Question> root = criteria.from(Question.class);
Path<Long> qId = root.get("id");
Path<String> qTitle = root.get("title");
Join<Question, Tag> qTag = root.join("tags", JoinType.INNER);
criteria.multiselect(qId, qTitle, qTag);
List<Tuple> tuples = session.createQuery(criteria).getResultList();
for (Tuple tuple : tuples)
{
Long id = tuple.get(qId);
String title = tuple.get(qTitle);
Tag tag = tuple.get(qTag);
}
Другой альтернативой для выбора нескольких значений является выбор объекта, который будет "оборачивать" несколько значений , Для этого подхода вы должны объявить класс-оболочку:
public class QuestionTag
{
private final Long id;
private final String title;
private final Tag tag;
public QuestionTag(Long id, String title, Tag tag)
{
this.id = id;
this.title = title;
this.tag = tag;
}
public Long getId()
{
return id;
}
public String getTitle()
{
return title;
}
public Tag getTag()
{
return tag;
}
}
, а затем использовать его в запросе:
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<QuestionTag> criteria = builder.createQuery(QuestionTag.class);
Root<Question> root = criteria.from(Question.class);
Path<Long> qId = root.get("id");
Path<String> qTitle = root.get("title");
Join<Question, Tag> qTag = root.join("tags", JoinType.INNER);
criteria.select(builder.construct(QuestionTag.class, qId, qTitle, qTag));
List<QuestionTag> wrappers = session.createQuery(criteria).getResultList();