2
votes

Spring Data - Requête DTO personnalisée avec filtrage

J'ai une application complexe et j'ai besoin de récupérer et filtrer 1000 ~ 5000 objets pour une exportation xls. Chaque objet ayant plusieurs relations enthousiastes (j'en ai besoin pour l'exportation).

Si je récupère tous les objets et leur relation tels quels, j'ai une erreur de stackoverflow.

Généralement quand j'ai besoin de faire un gros export, afin de le rendre efficace, j'utilise un objet DTO avec une @Query comme celle-ci:

public interface myRepository extends JpaRepository<Car, Long> {

    @Query("SELECT new com.blabla.myCustomObject(p.name, p.surname, c.model, c.number ...) "
            + "FROM Car c "
            + "LEFT JOIN c.person p "
            + "WHERE ... ")
    List<myCustomObject> getExportCustomObject();
}

Le problème est que la @Query est statique et je veux ajouter un filtre dynamique à ma requête (spécifications, critères ou tout autre système ...)

Comment faire?


0 commentaires

3 Réponses :


0
votes

La spécification ne peut pas être utilisée car il ne s'agit que de la clause where.

Mais vous pouvez utiliser l'API Criteria. Voici un exemple. Le BasicTeacherInfo est le DTO:

CriteriaQuery<BasicTeacherInfo> query = cb.createQuery(BasicTeacherInfo.class);
Root<Teacher> teacher = query.from(Teacher.class);
        query.multiselect(teacher.get("firstName"),teacher.get("lastName"));

List<BasicTeacherInfo> results = em.createQuery(query).getResultList();


0 commentaires

0
votes

Vous pouvez utiliser l'annotation @Param pour transmettre des valeurs dynamiques à HQL, quelque chose comme:

@Query("SELECT new com.blabla.myCustomObject(p.name, p.surname, c.model, c.number ...) "
        + "FROM Car c "
        + "LEFT JOIN c.person p "
        + "WHERE c.status = :status AND p.name = :name")
List<myCustomObject> getExportCustomObject(
    @Param("status") Integer status, 
    @Param("name") String name
);


0 commentaires

0
votes

Vous trouverez ci-dessous l'une des manières possibles d'essayer d'ajouter un décalage et une limite dans votre requête, vous pouvez la rendre dynamique avec l'aide des espaces réservés.

Voici un exemple de pseudo-code pour référence:

< pre> XXX

J'espère que cela vous sera utile.


0 commentaires