Comment sélectionner tous les enregistrements distincts en tant qu’entités – mise en veille prolongée – JPA ?

la programmation


Je souhaite sélectionner tous les enregistrements distincts, non spécifiques, mais en tant qu’entités.

j’utilise Hiberner 5.6.15, JPA 2.2 et JDK 11 LTS

J’ai essayé de sélectionner transid comme entité de commandes mais j’ai obtenu :

XML
Caused by: java.lang.ClassCastException: class java.lang.String cannot be cast to class com.tailorfx.pojo.Orders

Ce que j’ai essayé :

Java
public List<Orders> custOrder() {
    try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
        CriteriaBuilder cb = session.getCriteriaBuilder();
        CriteriaQuery<Orders> cq = cb.createQuery(Orders.class);
        Root<Orders> root = cq.from(Orders.class);

        cq.select(root.get("transid")).distinct(true);

        return session.createQuery(cq).getResultList();
    }
}

Je souhaite donc sélectionner tous les transids distincts, mais en tant qu’entités et non en tant que chaîne.
Alors comment faire ?

Solution 1

Voici la réponse :

public List<Orders> custOrder() {
    try ( Session session = HibernateUtil.getSessionFactory().openSession()) {
        CriteriaBuilder cb = session.getCriteriaBuilder();
        CriteriaQuery<Orders> cq = cb.createQuery(Orders.class);
        Root<Orders> root = cq.from(Orders.class);

        Subquery<Long> subquery = cq.subquery(Long.class);
        Root<Orders> subRoot = subquery.from(Orders.class);
        subquery.select(cb.max(subRoot.get("id")));
        subquery.groupBy(subRoot.get("transid"));

        cq.where(cb.in(root.get("id")).value(subquery));

        return session.createQuery(cq).getResultList();
    }
}

コメント

タイトルとURLをコピーしました