带有varargs的JPA存储库和构造函数

时间:2018-04-21 09:55:14

标签: java hibernate spring-boot jpa variadic-functions

可以在@Query(org.springframework.data.jpa.repository)中使用varargs的构造函数。我的意思是这样的课:

public class EntityDTO {

  public EntityDTO(Long id, LocalDate... dates) {
    // some code here where dates 
    //which are converted to List<Pair<LocalDate, LocalDate> datesList
  }
}

public interface CustomRepository extends JpaRepository<Entity, Long> {

  @Query("SELECT new package.path.EntityDTO(id, date1, date2, date2) FROM Entity")
  List<EntityDTO> findEntityList();
}

现在出现这样的错误:

Unsatisfied dependency expressed through constructor parameter 3
 Validation failed for query for method public abstract java.util.List CustomRepository.findEntityList(java.lang.Long,java.time.LocalDate,java.time.LocalDate)

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: 
 Unable to locate appropriate constructor on class [EntityDTO]. Expected arguments are: long, java.time.LocalDate, java.time.LocalDate, java.time.LocalDate, java.time.LocalDate

这只是查询示例,因为dto可以在构造函数中具有2到12-14的id和LocalDate参数,日期可以来自不同的表(实体)。这取决于查询。为了这个目的,我希望课程更通用。查询比这个例子复杂得多,但我对某种构造函数很感兴趣,这使我有可能创建类似于我在注释中的EntityDTO构造函数中描述的内容。可以在@Query

中使用varargs

编辑: 如果JPQL没有此功能,您有什么建议可以使用吗?

1 个答案:

答案 0 :(得分:0)

我担心这是不可能的。

Hibernate实现匹配构造函数解析的方式,只有与传递给构造函数表达式的参数数量具有完全相同参数数量的构造函数才被视为潜在匹配。

解决方法可以创建一个接受列表的构造函数,然后将查询修改为SELECT NEW EntityDTO(id, NEW list(date1, date2, date2))行的内容...如果只有嵌套的NEW表达式得到了支持。不幸的是,这是一个长期存在的feature request