Spring Boot 在JPQL查询中创建条件筛选器

bsxbgnwa  于 2022-11-29  发布在  Spring
关注(0)|答案(1)|浏览(159)

我有两个用户角色,在我的系统中,“根”和“简单用户”。在某个页面中,我需要执行不同的数据过滤,因为“根”可以看到所有数据,而“简单用户”只能看到他们公司的一定数量的数据。下面是过滤器的两个查询:

///ROOT
"SELECT new com.data.dto.RelatorioFinaceiroDTO(r.id, r.dth_reserva, r.km_retirada,r.km_devolucao) FROM Reserva r WHERE  (r.dth_reserva >= :dtInicio AND r.dth_reserva <= :dtFim) AND r.veiculo.perfil=1 AND r.reserva.status=5 "

///Simple User

"SELECT new com.data.dto.RelatorioFinaceiroDTO(r.id, r.dth_reserva, r.km_retirada,r.km_devolucao) FROM Reserva r WHERE  (r.dth_reserva >= :dtInicio AND r.dth_reserva <= :dtFim) AND r.veiculo.perfil=1 AND r.reserva.status=5 AND r.veiculo.empresa.id = :empresaid"

这两者之间的唯一区别是r.veiculo.empresa.id在简单用户的情况下添加了“www.example.com =:empresaid”。
我只想为“:role”创建一个带有条件语句的查询
我试试这个:

"SELECT new com.data.dto.RelatorioFinaceiroDTO(r.id, r.dth_reserva, r.km_retirada,r.km_devolucao) FROM Reserva r WHERE  (r.dth_reserva >= :dtInicio AND r.dth_reserva <= :dtFim) AND r.veiculo.perfil=1 AND (CASE WHEN :role!='ROOT' THEN r.reserva.status=5 AND r.veiculo.empresa.id = :empresaid ELSE TRUE END)"
xkftehaa

xkftehaa1#

您不能以这种方式使用CASE,因为SQL中的逻辑测试(JPQL最终转换为)没有内在的布尔值。
尝试AND :role = 'ROOT' or (r.reserva.status = 5 AND r.veiculo.empresa.id = :empresaid)
在任何情况下,它将更可读,只是有单独的查询IMHO,或使用动态查询构建API,如标准或QueryDSL。

相关问题