#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);