【问题标题】:JPQL query Exception unexpected AST node: {vector}JPQL 查询异常 AST 节点:{vector}
【发布时间】:2020-02-13 10:32:15
【问题描述】:

亲爱的,我在使用 JPQL 查询时遇到问题,当我使用 IN 和 List(Long) 时出现错误,但并非总是如此

this is the model (是查看关系的最小模型,没有所有列)

如果我在 mi repo 中进行此查询工作正常:

@Query(value = "SELECT a FROM Artist a WHERE a.idArtist IN(SELECT a.idArtist FROM ArtistStyle x "
            + "INNER JOIN x.style s " 
            + "INNER JOIN x.artist a " 
            + "WHERE s.idStyle IN (:arrayStyles))")
    public List<Artist> FilterArtistWithStyles(List<Long> arrayStyles);

但如果我执行此查询,我会得到错误:

@Query(value = "SELECT a FROM Artist a WHERE a.idArtist IN(SELECT a.idArtist FROM ArtistStyle x "
            + "INNER JOIN x.style s " 
            + "INNER JOIN x.artist a " 
            + "INNER JOIN a.country c " 
            + "INNER JOIN a.aal1 a1 "
            + "INNER JOIN a.aal2 a2 " 
            + "INNER JOIN a.aal3 a3 " 
            + "WHERE (:arrayStyles IS NULL OR s.idStyle IN (:arrayStyles)) "
            + "AND (:name IS NULL OR a.name like %:name%)" + "AND (:gender IS NULL OR a.gender = :gender) "
            + "AND (:experienceFrom IS NULL OR a.workStartYear <= :experienceFrom) "
            + "AND (:ratingFrom IS NULL OR a.ratingAccordance >= :ratingFrom) "
            + "AND (:delivery IS NULL OR a.delivery = :delivery) "
            + "AND (:exchange IS NULL OR a.exchange = :exchange) " + "AND (:courses IS NULL OR a.courses = :courses)"
            + "AND (:idCountry IS NULL OR c.idCountry = :idCountry)"
            + "AND (:idAal1 IS NULL OR a1.idAdministrativeAreaLevel1 = :idAal1)"
            + "AND (:idAal2 IS NULL OR a2.idAdministrativeAreaLevel2 = :idAal2)"
            + "AND (:idAal3 IS NULL OR a3.idAdministrativeAreaLevel3 = :idAal3)" + ")")
    public List<Artist> SearchArtistWithStyles(String name, List<Long> arrayStyles, Integer gender, Integer experienceFrom, Double ratingFrom, Integer delivery,
            Integer exchange, Integer courses, Long idCountry, Long idAal1, Long idAal2, Long idAal3,
            Pageable pageable);

这是错误:

"status": 500,
"error": "Internal Server Error",
"message": "org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: {vector} [SELECT a FROM com.mushroomstudios.skink.entities.Artist a WHERE a.idArtist IN(SELECT a.idArtist FROM com.mushroomstudios.skink.entities.ArtistStyle x INNER JOIN x.style s INNER JOIN x.artist a INNER JOIN a.country c INNER JOIN a.aal1 a1 INNER JOIN a.aal2 a2 INNER JOIN a.aal3 a3 WHERE (:arrayStyles_0, :arrayStyles_1, :arrayStyles_2 IS NULL OR s.idStyle IN (:arrayStyles_0, :arrayStyles_1, :arrayStyles_2)) AND (:name IS NULL OR a.name like :name)AND (:gender IS NULL OR a.gender = :gender) AND (:experienceFrom IS NULL OR a.workStartYear <= :experienceFrom) AND (:ratingFrom IS NULL OR a.ratingAccordance >= :ratingFrom) AND (:delivery IS NULL OR a.delivery = :delivery) AND (:exchange IS NULL OR a.exchange = :exchange) AND (:courses IS NULL OR a.courses = :courses)AND (:idCountry IS NULL OR c.idCountry = :idCountry)AND (:idAal1 IS NULL OR a1.idAdministrativeAreaLevel1 = :idAal1)AND (:idAal2 IS NULL OR a2.idAdministrativeAreaLevel2 = :idAal2)AND (:idAal3 IS NULL OR a3.idAdministrativeAreaLevel3 = :idAal3)) order by a.name asc]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: {vector} [SELECT a FROM com.mushroomstudios.skink.entities.Artist a WHERE a.idArtist IN(SELECT a.idArtist FROM com.mushroomstudios.skink.entities.ArtistStyle x INNER JOIN x.style s INNER JOIN x.artist a INNER JOIN a.country c INNER JOIN a.aal1 a1 INNER JOIN a.aal2 a2 INNER JOIN a.aal3 a3 WHERE (:arrayStyles_0, :arrayStyles_1, :arrayStyles_2 IS NULL OR s.idStyle IN (:arrayStyles_0, :arrayStyles_1, :arrayStyles_2)) AND (:name IS NULL OR a.name like :name)AND (:gender IS NULL OR a.gender = :gender) AND (:experienceFrom IS NULL OR a.workStartYear <= :experienceFrom) AND (:ratingFrom IS NULL OR a.ratingAccordance >= :ratingFrom) AND (:delivery IS NULL OR a.delivery = :delivery) AND (:exchange IS NULL OR a.exchange = :exchange) AND (:courses IS NULL OR a.courses = :courses)AND (:idCountry IS NULL OR c.idCountry = :idCountry)AND (:idAal1 IS NULL OR a1.idAdministrativeAreaLevel1 = :idAal1)AND (:idAal2 IS NULL OR a2.idAdministrativeAreaLevel2 = :idAal2)AND (:idAal3 IS NULL OR a3.idAdministrativeAreaLevel3 = :idAal3)) order by a.name asc]",

最后,如果我做那个查询,也可以正常工作:

@Query(value = "SELECT a FROM Artist a " + "INNER JOIN a.country c " 
            + "INNER JOIN a.aal1 a1 "
            + "INNER JOIN a.aal2 a2 " 
            + "INNER JOIN a.aal3 a3 " 
            + "WHERE (:name IS NULL OR a.name like %:name%) "
            + "AND (:gender IS NULL OR a.gender = :gender) "
            + "AND (:experienceFrom IS NULL OR a.workStartYear <= :experienceFrom) "
            + "AND (:ratingFrom IS NULL OR a.ratingAccordance >= :ratingFrom) "
            + "AND (:delivery IS NULL OR a.delivery = :delivery) "
            + "AND (:exchange IS NULL OR a.exchange = :exchange) " + "AND (:courses IS NULL OR a.courses = :courses)"
            + "AND (:idCountry IS NULL OR c.idCountry = :idCountry)"
            + "AND (:idAal1 IS NULL OR a1.idAdministrativeAreaLevel1 = :idAal1)"
            + "AND (:idAal2 IS NULL OR a2.idAdministrativeAreaLevel2 = :idAal2)"
            + "AND (:idAal3 IS NULL OR a3.idAdministrativeAreaLevel3 = :idAal3)")
    public List<Artist> SearchArtist(String name, Integer gender, Integer experienceFrom, Double ratingFrom,
            Integer delivery, Integer exchange, Integer courses, Long idCountry, Long idAal1, Long idAal2, Long idAal3,
            Pageable pageable);

第二个查询有什么不好的地方吗?如果您需要更多信息,例如实体或其他信息,请告诉我,提前谢谢

【问题讨论】:

  • Idk 如果这是原因,但您正在重用 a 别名
  • Offtopic:a.name like %:name% 是性能杀手。
  • 谢谢,但我认为如果我使用 (:name IS NULL OR a.name like %:name%) 只有在 :name 值不为空时才会执行类似的操作,如果用户不要输入任何内容。无论如何,那样是性能杀手吗?我可以用其他方式代替吗?
  • 它的名字是空的,而不是这个子句,但如果不是 - 你将有非索引的整个表匹配搜索。

标签: java hibernate jpql


【解决方案1】:

问题出在这一行

 "WHERE (:arrayStyles IS NULL OR s.idStyle IN (:arrayStyles)) "

我改成,并且工作正常

+ "WHERE s.idStyle IN (:arrayStyles) "

【讨论】:

    【解决方案2】:

    我必须做一个解决方法,如果 List 有元素,则创建一个布尔值:

    ...

    Boolean shouldValidateList = someList != null &amp;&amp; !someList().isEmpty();

    ...

    "Where :shouldValidateList = false or FieldInQuestion IN :someList"

    附言。就我而言,我在“where”条件下还有其他过滤器,只是“IN”对我不起作用。但是如果它是唯一的过滤器,那么“IN”就可以完美地工作

    【讨论】:

      猜你喜欢
      • 2011-07-29
      • 2014-08-24
      • 2020-05-02
      • 2018-06-26
      • 2011-05-11
      • 1970-01-01
      • 2021-12-05
      • 2017-01-04
      • 2021-08-21
      相关资源
      最近更新 更多