У меня есть таблица сущностей, и я хочу отсортировать через 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