CriteriaQuery с OrderBy от ElementCollection - PullRequest
0 голосов
/ 12 июня 2019

У меня есть таблица сущностей, и я хочу отсортировать через CriteriaQuery.orderBy, используя один атрибут, который является ElementCollection. У меня нет проблем с orderBy для столбца Basic (String).

Приведенный ниже код приводит к:

select certificat0_.Name as Name13_25_, ... from CertificatePolicy certificat0_ cross join CertificatePolicy_Usages usages1_ where certificat0_.dbID=usages1_.CertificatePolicy_id order by . asc offset 0 rows fetch next ? rows only
com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'asc'.

В sql проблема, кажется, "by. Asc", где "." должно быть "использования", но как-то разрешено "." Не уверен, почему hibernate делает это.

Код работает нормально, если я пытаюсь упорядочить по столбцу «имя» вместо «использования». Так что я, очевидно, недостаточно умен, чтобы сказать критерию Query, что делать.

Вот мой примерный код:

@Entity()
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "ID" }) }, name = "CertificatePolicy")
public class CertificatePolicy {
    @Basic()
    @Column(name = "Name")
    private String name = null;

    @ElementCollection(fetch = FetchType.EAGER)
    @Column(name = "T_element")
    @CollectionTable(joinColumns = { @JoinColumn(name = "CertificatePolicy_id") }, name = "CertificatePolicy_Usages")
    private Set<String> usages = new HashSet<String>();

    @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
    @JoinColumns({ @JoinColumn(name = "CertificatePolicy_id") })
    private Set<KeyType> supportedKeyTypes = new HashSet<KeyType>();
}

public List<CertificatePolicy> query() {
    query(0, 10, "name"); // WORKS
    query(0, 10, "usages"); // Fails
    query(0, 10, "supportedKeyTypes"); // Fails
}

private List<CertificatePolicy> fetch(int offset, int limit, String property) {
    EntityManager em = ...;
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<?> criteriaQuery = builder.createQuery(CertificatePolicy.class);
    Root<CertificatePolicy> root = criteriaQuery.from(CertificatePolicy.class);
    List<Order> orders = new ArrayList<>();

    Expression<?> path = root.get(property);
    orders.add( ascending ? builder.asc(path) ? builder.desc(path) );
    criteriaQuery.select(root);
    criteriaQuery.orderBy(orders);
    List<CertificatePolicy> items = em.createQuery(criteriaQuery)
    .setFirstResult(offset).setMaxResults(limit).getResultlList();
    return items;
}

Использование hibernate 5.4.3.Final

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...