[英]JPQL CASE STATEMENT in WHERE CLAUSE PROBLEMS
I have some problems with case statement in where
clause. 我在where
子句中的case语句有一些问题。 If someone knows how to fix this please help me! 如果有人知道如何解决这个问题,请帮助我! Thank you. 谢谢。
@Query("select e from EventTeamPlayer etp "
+ "join etp.event e "
+ "left join e.leagueTournament lt "
+ "left join lt.sportCategory sc "
+ "left join e.sport s "
+ "left join etp.homeTeamPlayer htpl "
+ "left join etp.awayTeamPlayer atpl "
+ "left join lt.country c "
+ "left join e.eventStatus es "
+ "where (e.startDate >= :startDate and e.startDate <= :endDate) "
+ "and lt.id = :leagueTournamentId "
+ "and (lt.defaultName like :searchTerm or "
+ "s.name like :searchTerm or "
+ "htpl.name like :searchTerm or "
+ "atpl.name like :searchTerm or "
+ "e.id like :searchTerm) and "
+ "(case when (:minDate is not null and :maxDate is not null) "
+ " then (e.startDate >=:minDate and e.startDate<=:maxDate) else true end) = true")
Page<Event> getEventsForWebAdmin(Pageable pageable,
@Param("searchTerm") String searchTerm,
@Param("leagueTournamentId") int leagueTournamentId,
@Param("startDate") Date startDate,
@Param("endDate") Date endDate,
@Param("minDate") Date minDate,
@Param("maxDate") Date maxDate);
AND HERE IS THE ERROR IN LOG : 这里是日志中的错误:
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: and near line 1, column 589 [select e from com.itengine.bettinggateway.dao.EventTeamPlayer etp join etp.event e left join e.leagueTournament lt left join lt.sportCategory sc left join e.sport s left join etp.homeTeamPlayer htpl left join etp.awayTeamPlayer atpl left join lt.country c left join e.eventStatus es where (e.startDate >= :startDate and e.startDate <= :endDate) and (lt.defaultName like :searchTerm or s.name like :searchTerm or htpl.name like :searchTerm or atpl.name like :searchTerm or e.id like :searchTerm) and (case when (:minDate is not null and :maxDate is not null) then (e.startDate >=:minDate and e.startDate<=:maxDate) else true end) = true and lt.id = :leagueTournamentId] 引起:org.hibernate.hql.internal.ast.QuerySyntaxException:意外的AST节点:并且在第1行附近,第589行 [从com.itengine.bettinggateway.dao.EventTeamPlayer中选择e并加入etp.event e left join e.leagueTournament左边连接lt.sportCategory sc left join e.sport s left join etp.homeTeamPlayer htpl left join etp.awayTeamPlayer atpl left join lt.country c left join e.eventStatus es where(e.startDate> =:startDate and e.startDate <=:endDate)和(lt.defaultName like:searchTerm或s.name like:searchTerm或htpl.name like:searchTerm或atpl.name like:searchTerm或e.id like:searchTerm)and(case when(:minDate is) not null和:maxDate不为null)然后(e.startDate> =:minDate和e.startDate <=:maxDate)else true end)= true和lt.id =:leagueTournamentId]
I dont think you can pull that kind of statement in JPQL. 我不认为你可以在JPQL中使用那种语句。
Try to replace it with something like this: 尝试用这样的东西替换它:
AND
(
(:minDate is not null and :maxDate is not null
and e.startDate >=:minDate and e.startDate<=:maxDate)
OR
(:minDate is null or :maxDate is null)
)
If you look at the JPQL API docs , it says that: 如果您查看JPQL API文档 ,它会说:
when_clause::= WHEN conditional_expression THEN scalar_expression
So then
clause can use: 那么then
子句可以使用:
scalar_expression ::= arithmetic_expression | string_primary | enum_primary | datetime_primary | boolean_primary | case_expression | entity_type_expression
And you are violating this within your then clause. 你在你的子句中违反了这一点。 Try to replace your CASE with AND-OR combination. 尝试用AND-OR组合替换CASE。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.