当前位置: 首页 > 知识库问答 >
问题:

WHERE子句问题中的JPQL CASE语句

荆树
2023-03-14

我对< code>where子句中的case语句有一些问题。如果有人知道如何解决这个问题,请帮助我!谢谢你。

 @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);

下面是日志中的错误:

原因:org.hibernate.hql.internal.ast.QuerySyntaxException: 意外的 AST 节点: 和靠近第 1 行, 列 589 [从 com.itengine.bettinggateway.dao.事件中选择 e.事件 tp.事件 e左加入 e.leaguetourntentent lt 左加入 lt.sport类别 sc 左加入 e.home团队玩家 htpl 左加入 etp.away团队玩家 atpl 左加入 lt.国家 c 左加入 e.事件状态在哪里 (例如 startDate

共有2个答案

任长卿
2023-03-14

如果你看一下JPQL API文档,它说:

when_clause::=when conditional_expression THEN scalar_expression

那么句可以使用:

scalar_expression ::= arithmetic_expression | string_primary | enum_primary | datetime_primary | boolean_primary | case_expression | entity_type_expression

你违反了你的th子句中的这一点。试着用AN-OR组合替换你的CASE。

高山
2023-03-14

我认为你不能在JPQL中使用这种语句。

尝试将其替换为以下内容:

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)                   
)
 类似资料:
  • 问题内容: 我在mysql中的“ where in”子句中遇到问题,我无法弄清楚出了什么问题。所以我有两张桌子… 1)座位 (int)seat_id 2)寄存器 (int)register_id (varchar)seat_ids-以逗号分隔的席位,例如102,103,104 因此,我要获取匹配结果的查询是 有人可以找出问题所在吗?谢谢, 问题答案: 要求列表是文字列表,而不是逗号分隔的字符串。用

  • 问题内容: 希望有人可以帮助, 我想做的是从任何给定的月份从数据库中提取所有结果,是否可能仅使用mysql查询(没有php)。 我使用的模板应用程序具有我唯一的访问权限,是通过mysql where语句,所以我需要从“ 2013-04-01”中计算出月份是多少,如果需要的话,请抓住它。 下面的代码有效,但显然也将2013年与我联系在一起。 问题答案: 参考

  • 问题内容: 我将如何在没有硬编码值的情况下编写此sql语句? 宁愿有这样的事情: 提前致谢.. 问题答案: 用您当前的方式构造SQL查询是一个糟糕的主意,因为它为各种SQL注入攻击打开了大门 。为了正确执行此操作,您必须改为使用“ 预备语句”。这也将解决您目前显然遇到的各种逃避问题。 请注意,这是一个昂贵的调用(除非您的应用程序服务器使用语句缓存和其他类似的功能)。从理论上讲,最好先准备一次语句,

  • 问题内容: SQL不是我的强项,但是我无法弄清楚为什么它不起作用。我只是想基于一个值运行一个不同的AND语句。具体来说,如果foo =0,我想在dateDiff函数中更改datePart 问题答案: 试试这个-

  • 问题内容: 在WHERE子句中有使用SELECT语句描述的名称吗?这是好/不好的做法吗? 这会是更好的选择吗? 它远没有那么优雅,但是运行起来比以前的版本要快。我不喜欢它,因为它在GUI中没有非常清晰地显示(并且SQL初学者需要理解它)。我可以将其分为两个独立的查询,但是随后事情变得混乱了…… 注意:我不仅需要日期和分数(例如姓名) 问题答案: 称为相关子查询。它有它的用途。

  • 问题内容: 我该如何纠正我不断从以下状态代码中得到的问题。我在这里先向您的帮助表示感谢。 这是mysql表。 问题答案: 您只需要指定要使用的字段,因为和表都有一个名为的字段: SQL不会容忍这种歧义,因为就其所知,两个字段都可以代表完全不同的数据。