HQL Case When error unexpected AST 节点:第 1 行附近的 CASE

HQL Case When error unexpected AST node: CASE near line 1

我的存储库中有一个查询。

@Query(Constant.QUERY)
List<Guide> findGuide(@Param("locationName") String locationName, @Param("gender") String gender, @Param("type") String type, @Param("language") String language);

并且Constant.QUERY是

public static final String QUERY_FIND_GUIDE = "SELECT g.id FROM Guide g " + 
        " LEFT JOIN g.user u  " + 
        " LEFT JOIN g.locations l " + 
        " LEFT JOIN g.languages lang "+
        "WHERE (UPPER(:locationName)=UPPER('NULL') OR :locationName IS NULL OR :locationName ='' OR l.locationName = :locationName) "
        + " AND (UPPER(:gender)=UPPER('NULL') OR :gender IS NULL OR :gender ='' OR g.gender =:gender) "
        + " AND (:type IS NULL OR :type ='' OR "
        + " (CASE WHEN UPPER(:type)=UPPER('NULL') THEN (g.cardnumber IS NULL) ELSE (g.cardnumber IS NOT NULL) END) )"
        + " AND (UPPER(:language)=UPPER('NULL') OR :language IS NULL OR :language='' OR lang.language = :language)";

当我 运行 页面出现错误时:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: CASE near line 1, column 376 [SELECT g.id FROM com.webapp.tgo.entities.Guide g  LEFT JOIN g.user u   LEFT JOIN g.locations l  LEFT JOIN g.languages lang WHERE (UPPER(:locationName)=UPPER('NULL') OR :locationName IS NULL OR :locationName ='' OR l.locationName = :locationName)  AND (UPPER(:gender)=UPPER('NULL') OR :gender IS NULL OR :gender ='' OR g.gender =:gender)  AND (:type IS NULL OR :type ='' OR  (CASE WHEN UPPER(:type)=UPPER('NULL') THEN (g.cardnumber IS NULL) ELSE (g.cardnumber IS NOT NULL) END) ) AND (UPPER(:language)=UPPER('NULL') OR :language IS NULL OR :language='' OR lang.language = :language)]

我认为 "IS NULL" 不能在 "THEN" 之后的结果中使用,这是真的吗?如果错误请帮我检查这个错误:(

我认为 HQL(或 SQL 的任何其他版本)不会让您以您尝试使用它的方式使用 CASE 表达式。但是,我们可以将您的逻辑改写为:

WHERE
    (UPPER(:locationName) = UPPER('NULL') OR :locationName IS NULL OR
        :locationName = '' OR l.locationName = :locationName) AND
    (UPPER(:gender) = UPPER('NULL') OR :gender IS NULL OR :gender = '' OR
        g.gender = :gender) AND
    (:type IS NULL OR :type = '' OR
        ((UPPER(:type) = UPPER('NULL') AND g.cardnumber IS NULL) OR
        g.cardnumber IS NOT NULL) AND
    UPPER(:language) = UPPER('NULL') OR :language IS NULL OR :language = '' OR
    lang.language = :language)

我的答案的关键是后面的 CASE 表达式:

CASE WHEN UPPER(:type) = UPPER('NULL')
     THEN (g.cardnumber IS NULL)
     ELSE (g.cardnumber IS NOT NULL) END

重写为:

(UPPER(:type) = UPPER('NULL') AND g.cardnumber IS NULL) OR g.cardnumber IS NOT NULL

QuerySyntaxException 可能由以下原因引起:

  1. 你没有在 Hibernate.cfg.xml 中写映射。
  2. 您在 Hibernate.cfg.xml 中写了映射,但它出错了。
  3. 检查字段名是否使用了数据库中的关键字。