Порядок запроса критериев JPA - выборка повторяющихся записей - PullRequest
1 голос
/ 29 октября 2019

Hiiii, я использую J2EE с реализацией EclipseLink JPA 2.1 для проекта. Моя ОС Windows10. Я пытаюсь упорядочить всех своих пользователей в соответствии с их именем пользователя (идентификатором таблицы). У меня есть суперкласс "Utilisateur" и 2 подкласса "RespAudit" и "MembreAudit", реализованные следующим образом:

    @Entity
    @Table(name = "UTILISATEUR", catalog = "", schema = "HSEMS_DB")
    @Inheritance(strategy = InheritanceType.JOINED)
    public class Utilisateur implements Serializable {

        private static final long serialVersionUID = 1L;

        @Id
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 255)
        @Column(name = "IDUSER")
        private String iduser;

        @Pattern(regexp = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message = "E-mail invalide!")//if the field contains email address consider using this annotation to enforce field validation
        @Size(max = 255)
        @Column(name = "EMAIL")
        private String email;

        @Size(min = 2, max = 255, message = "Taille du champ invalide!")
        @Column(name = "NOM")
        private String nom;

        @Size(min = 2, max = 255, message = "Taille du champ invalide")
        @Column(name = "PRENOM")
        private String prenom;

        @Size(min = 8, message = "La taille du mot de passe doit etre entre 8 et 20 caractères")
        @Column(name = "PASSWORD")
        private String password;

        @OneToMany(mappedBy = "utilisateur",cascade = CascadeType.MERGE)
        private List<Commentaire> commentaireList = new ArrayList<>();

        @OneToMany(mappedBy = "utilisateur",cascade = CascadeType.MERGE)
        private List<JournalLog> LogList = new ArrayList<>();

        @OneToMany(mappedBy = "utilisateur",cascade = CascadeType.MERGE)
        private List<Fichier> filesList = new ArrayList<>();}

, затем дочерний Respaudit

    @Entity
    @Table(name = "RESPAUDIT", catalog = "", schema = "HSEMS_DB")
    @PrimaryKeyJoinColumn(referencedColumnName = "IDUSER")

    public class Respaudit extends Utilisateur implements Serializable {

        private static final long serialVersionUID = 1L;

        @JoinColumn(name = "respAudit", referencedColumnName = "equipe")
        @OneToOne(cascade = CascadeType.MERGE, mappedBy = "respAudit")
        private Auditeur equipe;
    }

, за которым следует последний дочерний элемент Membraudit



    @Entity
    @Table(name = "MEMBREAUDIT", catalog = "", schema = "HSEMS_DB")
    @PrimaryKeyJoinColumn(referencedColumnName = "IDUSER")

    public class Membreaudit extends Utilisateur implements Serializable {

        private static final long serialVersionUID = 1L;

        @JoinColumn(name = "IDEQUIPE")
        @ManyToOne
        private Auditeur equipe;

       @OneToMany(mappedBy = "idMembre", cascade = CascadeType.MERGE)
        private List<Affectation> affectationList;
    }

Когда я использую порядок по методу в подтаблицах для сортировки записей. Это дает дублированные записи. Я пытался использовать «отличный» метод, как показано в следующем методе findAll, но он кажется безрезультатным.

public List<T> findAll(String attribute) {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        cq.orderBy(getEntityManager().getCriteriaBuilder().asc(cq.from(entityClass).get(attribute))).distinct(true);
        List<T> myList = getEntityManager().createQuery(cq).getResultList();
        return myList;
    }

Может кто-нибудь дать мне знать, как это сделать без дубликатов? Заранее спасибо

...