2017-09-29 3 views
0

J'ai une table avec plusieurs lignes et colonnes. Je veux récupérer avec JpaRepository une liste de tous les champs d'une colonne.Comment faire pour récupérer une liste de champs String uniques à partir d'une colonne dans une table avec Spring Data JPA?

devrais-je écrire une requête comme:

SELECT DISTINCT field2 FROM entity; 

et annoter la méthode avec @Query (QUERY_STRING)

ou est-il un moyen plus facile en utilisant JPA?

Merci.

+0

Ces informations ne sont pas dans tableName mais dans la table système de votre SGBD –

+0

Avez-vous une [classe d'entité] (http://www.objectdb.com/java/jpa/entity/types#Entity_Classes_) liée à cette table ? – Cepr0

+0

@ Cepr0 Oui, j'ai un objet Object qui a plusieurs champs field1, field2, field 3. Hibernate crée la table et je veux récupérer après une liste de toutes les valeurs (de dupliquées) de field2. – user3450862

Répondre

0

Si vous avez besoin pour obtenir une liste de valeur d'un champ, vous pouvez effectuer les opérations suivantes:

public interface MyEntityRepo extends JpaRepository<MyEntity, Integer> { 

    @Query("select distinct e.field1 from MyEntity e")  
    List<String> getField1Values(); 
} 

Si vous avez besoin pour obtenir une liste de valeurs pour un grand nombre de domaines que je peux vous proposer cette astuce dynamic projection:

public interface MyEntityRepo extends JpaRepository<MyEntity, Integer> { 

    // T - it's a type of a concrete projection 
    <T extends OneField> List<T> getDistinctBy(Class<T> type); 

    default <T extends OneField> List<?> getFieldValues(Class<T> type) { 
     return getDistinctBy(type) 
       .stream() 
       .map(T::getValue) 
       .collect(Collectors.toList()); 
    } 
} 

// T - it's a type of the table field 
public interface OneField<T> { 
    default T getValue() { 
     return null; 
    } 
} 

Ensuite, créez des projections pour vos champs de table qui liste de valeurs dont vous avez besoin pour obtenir et invoquer la méthode getFieldValues pour chaque projection, par exemple:

public interface Field1 extends OneField<String> { 

    @Override 
    default String getValue() { 
     return getField1(); 
    } 

    String getField1(); 
} 

List<?> values = repo.getFieldValues(Field1.class); 
+0

Je ne veux pas obtenir le champ1 de MyEntity par Id. Je veux une liste de tous les champs1 (sans duplication) de toutes les entités. Pour ce faire, je veux sélectionner uniquement la colonne field1. – user3450862

+0

@ user3450862 voir la mise à jour ... – Cepr0

0

Utilisation du JPA criteria api, quelque chose comme:

CriteriaQuery<Entity3450862> criteria = builder.createQuery(Entity3450862.class) 
Root root = criteria.from(Entity3450862.class); 
Set<Entity3450862> yourDesiredResult = new HashSet<>(); 
yourDesiredResult.addAll(criteria.select(root.get("T")).list()); 

devrait vous trier. Ce code n'a pas été testé, mais devrait vous orienter dans la bonne direction.