@Query Annotation不会填充和执行参数

时间:2017-10-10 21:14:57

标签: java sql spring hibernate spring-data-jpa

我正在使用带有Spring Boot的Hibernate JPA,我在使用CRUDRepository标签编写自定义SQL查询的@Query返回结果时遇到问题。当我访问DAO并执行该方法时,它会触发,但查询不会返回任何内容。

public interface ContactRepository extends CrudRepository<Contact, BigInteger> {

    @Query(value ="SELECT * FROM all_contacts ac WHERE ac.userid= :userId " +
          "AND LOWER(ac.city) LIKE CONCAT('%', LOWER(:city), '%')",
          nativeQuery=true)
    List<Contact> findAllUserContactsByCityPartialMatch(@Param("city") String city, @Param("userId") BigInteger userId);

}

当我在某个模型或控制器中触发代码时:

@Autowired
ContactRepository contactDAO

List<Contact> results = contactDAO.findAllUserContactsByCityPartialMatch("Chicago", 12345);

results将一直为空

我的记录器告诉我它解雇了这个问题:

SELECT * FROM all_contacts ac 
WHERE ac.userid= ? AND LOWER(ac.city) LIKE CONCAT('%', LOWER(?), '%')

我知道查询很好,因为当我运行查询并在MySQL终端中手动填充字段时,我得到了一个结果。

SELECT * FROM all_contacts ac
WHERE ac.userid= 12345 AND LOWER(ac.city) LIKE CONCAT('%', LOWER("Chicago"), '%')`

另外,我知道DB配置正确,因为如果我运行说

Iterable<Contact> contactItr = contactDAO.findAll();

在前面提到的同一个模型中,我从数据库中得到了几个持久的结果。

我的想法是,它没有填充参数或使用CRUDRepository类中的参数执行它们,但我不确定。有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

JPA中的本机查询不支持命名参数。您可以使用位置参数。

此外,您可以使用JPA查询语言而不使用@Query,例如:

public interface ContactRepository extends CrudRepository<Contact, BigInteger> {

    List<Contact> findAllByCityContainingIgnoreCaseAndUserId(String city, BigInteger userId);

}