在IN查询中使用spel的Spring Data JPA @Query

时间:2015-03-18 16:38:37

标签: spring hibernate spring-data-jpa

我在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)]

你知道为什么吗?

感谢您的帮助。

1 个答案:

答案 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