Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring数据-自定义DTO查询和筛选_Spring_Hibernate_Jpa_Spring Data - Fatal编程技术网

Spring数据-自定义DTO查询和筛选

Spring数据-自定义DTO查询和筛选,spring,hibernate,jpa,spring-data,Spring,Hibernate,Jpa,Spring Data,我有一个complexe应用程序,我需要检索和过滤1000~5000个对象,以便进行xls导出。每个对象都有多个渴望的关系(我需要它们用于导出) 如果按原样检索所有对象及其关系,则会出现一些stackoverflow错误 通常,当我需要进行大型导出时,为了提高效率,我使用DTO对象和@Query,如下所示: public interface myRepository extends JpaRepository<Car, Long> { @Query("SELECT new

我有一个complexe应用程序,我需要检索和过滤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();
}
公共接口myRepository扩展了JpaRepository{
@查询(“选择新com.blabla.myCustomObject(p.name、p.姓氏、c.model、c.number…)
+“来自c车”
+“左连接c.p
+“哪里……”
列出getExportCustomObject();
}
问题是@Query是静态的,我想在我的查询中添加动态过滤器(规范、条件或其他系统…)


怎么做

无法使用规范,因为这只是where子句

但您可以使用标准API。这里有一个例子。基本的eacherinfo是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();
CriteriaQuery=cb.createQuery(BasicTeacherInfo.class);
Root teacher=query.from(teacher.class);
multiselect(teacher.get(“firstName”)、teacher.get(“lastName”);
List results=em.createQuery(query.getResultList();

您可以使用@Param annotation将动态值传递给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
);
@Query(“选择新com.blabla.myCustomObject(p.name、p.姓氏、c.model、c.number…)
+“来自c车”
+“左连接c.p
+“其中c.status=:status和p.name=:name”)
列出getExportCustomObject(
@参数(“状态”)整数状态,
@参数(“名称”)字符串名称
);

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

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

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);
希望对你有帮助