Порядок критериев гибернации по столбцу связующей таблицы

У меня есть таблицы членства и персоны, которые связаны со связью manyToMany через таблицу person_membership. Таблица person_membership включает в себя person_id, members_id и sequence_number. Сущность "Членство" имеет следующий код для связи с таблицей лиц.

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
        name = "person_membership", 
        joinColumns = { @JoinColumn(name = "membership_id", nullable = false, updatable = false) }, 
        inverseJoinColumns = { @JoinColumn(name = "person_id", nullable = false, updatable = false) }
)
public Set<Person> getPersons() {
    return this.persons;
}

Получение членства осуществляется через критерии с использованием приведенного ниже кода:

Session session = getSession();
        Criteria c = session.createCriteria(Membership.class, "membership");
        c.add(Restrictions.eq("membershipNumber", membershipNumber));

        return (Membership) c.uniqueResult();

То, что я хочу сделать, это отсортировать результат по person_membership.sequence_number. Как я могу сделать это, используя критерии или, может быть, есть другой способ сделать это?

Я после хорошего, чистого и не сложного пути, если это возможно:)

1 ответ

Если вы хотите упорядочить людей во время выборки, укажите столбец sequenceNumber, используя аннотацию JPA @OrderBy.

@OrderBy("sequenceNumber")
public Set<Person> getPersons() {

Если вы хотите упорядочить все членства по person_membership.sequence_number, а затем вернуть первый или отдельный результат в результате, как показано ниже.

HQL

select distinct m 
from Membership m 
join m.persons p 
order by p.sequenceNumber;

критерии

    Session session = getSession();
    Criteria c = session.createCriteria(Membership.class, "membership");
    c.createCriteria("membership.persons", "person");
    c.add(Restrictions.eq("membershipNumber", membershipNumber));
    c.addOrder(Order.asc("person.sequenceNumber"))
    c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

    return (Membership) c.uniqueResult();
Другие вопросы по тегам