亲爱的,我在使用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);
在第二个查询中有不好的东西吗?如果您需要更多有关实体或其他内容的信息,请提前告知我
最佳答案
问题在这一行
"WHERE (:arrayStyles IS NULL OR s.idStyle IN (:arrayStyles)) "
我改了,工作正常
+ "WHERE s.idStyle IN (:arrayStyles) "