我在Spring Data JPA上工作,我有一个实现JpaRepository的存储库接口。
我已经编写了这个完美无缺的查询:
@Query ("FROM Person p " +
"LEFT JOIN p.relatedContractRoleAttributions rcras " +
"WHERE rcras.contract.id = :#{#contract.id} " +
"AND rcras.relatedContractRole.code = :#{#code}")
Person findByContractAndRelatedContractRole(@Param ("contract") Contract contract, @Param ("code") String code);
现在我想编写另一个可以在多个代码中找到的查询,所以我写了这个查询:
@Query ("FROM Person p " +
"LEFT JOIN p.relatedContractRoleAttributions rcras " +
"WHERE rcras.contract.id = :#{#contract.id} " +
"AND rcras.relatedContractRole.code IN (:#{#codes})")
List<Person> findByContractAndRelatedContractRoles(@Param ("contract") Contract contract, @Param ("codes") String... codes);
但是当我启动我的应用程序时,我遇到了这个错误:
Caused by: org.hibernate.QueryException: unexpected char: '#' [FROM com.krgcorporate.core.domain.access.Person p LEFT JOIN p.relatedContractRoleAttributions rcras WHERE rcras.contract.id = :#{#contract.id} AND rcras.relatedContractRole.code IN (:__$synthetic$__2)]
你知道为什么吗?
感谢您的帮助。
答案 0 :(得分:1)
对于JPA in
子句,您不能写括号。 (同样的问题在这里回答https://stackoverflow.com/a/4379008/280244)
@Query ("FROM Person p " +
"LEFT JOIN p.relatedContractRoleAttributions rcras " +
"WHERE rcras.contract.id = :#{#contract.id} " +
"AND rcras.relatedContractRole.code IN :#{#codes)")
说实话:我之前从未见过这种语法:#{#PARAM}
,我只知道:PARAM
。 - 但是当它在其他查询中工作时,也可以在下一个查询中使用
@Franck Yapadesouci Anso:根据你的评论:你确定你可以用这种方式使用SPEL表达式 - 尝试JPA方式。
@Query ("SELECT p FROM Person p " + //+SELECT p
"LEFT JOIN p.relatedContractRoleAttributions rcras " +
"WHERE rcras.contract = :contract" + //without ID and SPEL
"AND rcras.relatedContractRole.code IN :codes") //without brackets and SPEL