Spring数据-自定义DTO查询和筛选
我有一个complexe应用程序,我需要检索和过滤1000~5000个对象,以便进行xls导出。每个对象都有多个渴望的关系(我需要它们用于导出) 如果按原样检索所有对象及其关系,则会出现一些stackoverflow错误 通常,当我需要进行大型导出时,为了提高效率,我使用DTO对象和@Query,如下所示: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
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);
希望对你有帮助