弹簧数据 - JPA :使用 DTO 和 IF 语句发出查询



我正在尝试进行一个查询来构建DTO对象:

@Query("Select new com.mycorp.rh.web.rest.dto.AnalyseProductionDTO(a.client.name, IF(a.salarie,'yes','no'))   
from Activity a where a.year = ?1 and a.month = ?2")
List<AnalyseProductionDTO> getAnalyseProduction(Year year, Month month);

当我在查询中放置 IF 语句时,它不起作用。
我得到了一个

java.lang.IllegalArgumentException: 查询验证失败

当我这样做时它有效:

@Query("Select new com.mycorp.rh.web.rest.dto.AnalyseProductionDTO(a.client.name, 'yes')   
from Activity a where a.year = ?1 and a.month = ?2")
List<AnalyseProductionDTO> getAnalyseProduction(Year year, Month month);

是否可以在查询中使用的构造函数中包含 IF 语句?

默认情况下,@Query不允许本机查询。如果 ORM 处于休眠状态,则查询应为 HQL,或者底层 ORM 支持的任何查询。

由于IF()函数是MySQL的原生函数,并且不受ORM查询语言的支持,因此其验证将失败。

您可以在将@Query.nativeQuery设置为true的情况下尝试以下操作。

@Query(value = "Select new com.mycorp.rh.web.rest.dto.AnalyseProductionDTO(a.client.name, IF(a.salarie,'yes','no'))   
from Activity a where a.year = ?1 and a.month = ?2", nativeQuery = true)

最新更新