Spring Data-带有过滤的自定义DTO查询

时间:2019-06-18 09:29:17

标签: spring hibernate jpa spring-data

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

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

通常,当我需要进行大量导出时,为了使其高效,我将DTO对象与@Query一起使用,如下所示:

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是静态的,我想向查询中添加动态过滤器(规格,条件或其他系统...)

该怎么做?

3 个答案:

答案 0 :(得分:0)

不能使用规范,因为这只是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();

答案 1 :(得分:0)

您可以使用@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
);

答案 2 :(得分:0)

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

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

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

希望这会有所帮助。