我有一个复杂的应用程序,我需要检索和过滤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是静态的,我想向查询中添加动态过滤器(规格,条件或其他系统...)
该怎么做?
答案 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);
希望这会有所帮助。