2017-10-07 3 views
1

Salut, je suis nouveau pour JPA & Criteria API. J'essaie d'extraire des valeurs distinctes d'une seule colonne (en essayant d'obtenir seulement des valeurs distinctes de TestId). J'ai ci-dessous tableau dans ma base de données.Comment obtenir des valeurs distinctes d'une seule colonne dans l'API Criteria (JPA)

__________________________________ 
|TestId(Pk) | TestCol(PK) | TestEx| 
__________________________________ 

J'ai des classes ci-dessous Modèle de

@Data 
@Entity 
@Table(schema = "TEST", name = "TEST_TYPE") 
public class Test { 
    @EmbeddedId 
    private TestPK id; 

    @Column(nmae = "TestEX") 
    private double testEx 
} 

@Data 
@Embeddable 
public class TestPK { 
    @Column(name = "TestId") 
    private String testId; 

    @Column(name="TestCol") 
    private String testcol 
} 

classe Repository

public class TestRepoImpl { 

    @PersistenceContext 
    EntityManager em; 

    @Override 
    public List<Test> getData() { 
     CriteriaBuilder cb = em.getCriteriaBuilder(); 
     CriteriaQuery<Test> cq = cb.createQuery(Test.class); 
     Root<Test> root = cq.from(Test.class); 

     // cq.get(Test_.id).get(TestPK_.testId); 
     // cq.select(root); 
     cq.multiselect(root.get(Test_.id).get(TestPK_.testId)); 
     cq.distinct(true); 
     // List<Tuple> ts = em.createQuery(cq).getResultList(); 
     List<Test> data = em.createQuery(cq).getResultList(); 
     return data; 
    } 
} 

Je reçois ci-dessous erreur.

Les requêtes d'objet partiel ne sont pas autorisées à conserver le cache ou à le modifier. Vous devez utiliser dontMaintainCache().

Répondre

0

S'il vous plaît essayer cette option comme mentionné dans here((org.eclipse.persistence.jpa.JpaQuery)query).getDatabaseQuery().dontMaintainCache();

+0

quand il utilise Hibernate? puisqu'il l'a mis dans le titre de la question et dans les balises – DN1

+0

org.eclipse.persistence.internal.jpa.querydef.CriteriaQueryImpl ne peut pas être converti en org.eclipse.persistence.jpa.JpaQuery ... obtenir cette erreur en essayant votre solution. – PKS

0

Résultat n'est pas une liste de Test mais String, private String testId;

Changer

CriteriaQuery<Test> cq = cb.createQuery(Test.class);

à

CriteriaQuery<String> cq = cb.createQuery(String.class);

et le reste du code peut en conséquence aider.

+0

: - Je dois retourner l'objet Test si je vais avec votre solution, je vais obtenir. Incompatibilité de type: impossible de convertir la liste en erreur . – PKS

+0

S'il vous plaît détrompez-vous ce que vous cherchez et éditez votre question pour être plus précis. Vous voulez des valeurs distinctes de 'TestID' mais le résultat devrait être' Test'. Par exemple, s'il y a deux 'Test' ayant le même' TestPK.testId', vous pourriez avoir besoin de aggregate ou de choisir l'un des 'Test's. – pirho