【问题标题】:Spring Data - Custom DTO Query with filteringSpring Data - 带有过滤的自定义 DTO 查询
【发布时间】:2019-10-31 21:51:32
【问题描述】:

我有一个复杂的应用程序,我需要检索和过滤 1000~5000 个对象以进行 xls 导出。每个对象都有多个渴望关系(我需要它们来导出)。

如果我按原样检索所有对象及其关系,则会出现一些 stackoverflow 错误。

一般来说,当我需要进行大量导出时,为了提高效率,我会使用带有 @Query 的 DTO 对象,如下所示:

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();
}

问题是@Query 是静态的,我想将动态过滤器添加到我的查询(规范、标准或其他一些系统......)

怎么做?

【问题讨论】:

    标签: spring hibernate jpa spring-data


    【解决方案1】:

    不能使用规范,因为这只是 where 子句。

    但您可以使用 Criteria API。这是一个例子。 BasicTeacherInfo 是 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();
    

    【讨论】:

      【解决方案2】:

      您可以使用@Param 注解将动态值传递给 HQL,例如:

      @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
      );
      

      【讨论】:

        【解决方案3】:

        下面是一种可能的方式,您可以尝试在查询中添加偏移量和限制,您可以在占位符的帮助下使其动态化。

        下面是一个示例伪代码供参考:

        Dao Layer:
        
          @Query(value="SELECT e FROM tablename e WHERE  condition_here ORDER BY e.id offset :offset limit:limit ")
            public returnType yourMethod(String name, int offset, int limit);
        
        Service Layer:
        
        long count = number of records in db.
        
        int a = // number of records to be fetched on each iterations
        
        int num_iterations = count % a ;
        
        int additionalrecords = count / a;
        
        int start= 0;
        while(num_iterations>0)
        {
             dao.yourMethod(start,a);
             start = start+a;
             count--;
        
             // write your data to excel here
        }
        
         dao.yourMethod(start,additionalrecords);
        

        希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 2019-03-13
          • 2020-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-15
          • 2015-03-25
          • 2015-12-07
          • 2018-05-25
          相关资源
          最近更新 更多