Неверный результат в DetachedCriteria

#java #hibernate #detachedcriteria

#java #переход в спящий режим #разделенные критерии

Вопрос:

У меня есть несколько объектов, как показано ниже

 @Entity
public class Contact {
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "contact")
    private Set<ContactDetails> details = new HashSet<>();
}

@Entity
public class ContactDetails {
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
    private Contact contact;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "contact_details_values", joinColumn = @JoinColumn(name = "contact_detail_id"))
    @Column(name = "value")
    private Set<String> values = new HashSet<String>();
}
  

и у меня есть метод, который выбирает диапазон контактов с помощью DetachedCriteria, как показано ниже:

 public List<Contact> getContactsByRange(int start, int length) {
    DetachedCriteria criteria = DetachedCriteria.forClass(Contact.class);
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    Criteria executableCriteria = criteria.getExecutableCriteria(currentSession);
    executableCriteria.setFirstResult(start);
    executableCriteria.setMaxResults(length);
    return executableCriteria.list();
}
  

Проблема в том, что когда я вызываю метод с 0 и 10, он возвращает все контакты в базе данных, но когда я вызываю его с 0 и 1, он возвращает первый контакт в базе данных с его первым подробным значением, и если я вызываю его с 1 и 1, он возвращает первый контакт в базе данных с его вторым подробным значением.

Комментарии:

1. Я проверяю это снова и обнаружил, что он будет применять длину к деталям, а не к контактам, в других мирах он возвращает контакты до тех пор, пока количество деталей не достигнет длины. Как я должен указать критериям, чтобы применить ограничение к контактным данным not.

Ответ №1:

Наконец-то я нашел ответ. Я использую следующий код для своего метода:

 criteria.setFetchMode("details", FetchMode.SELECT);