我正在使用带有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
类中的参数执行它们,但我不确定。有什么想法吗?谢谢!
答案 0 :(得分:1)
JPA中的本机查询不支持命名参数。您可以使用位置参数。
此外,您可以使用JPA查询语言而不使用@Query
,例如:
public interface ContactRepository extends CrudRepository<Contact, BigInteger> {
List<Contact> findAllByCityContainingIgnoreCaseAndUserId(String city, BigInteger userId);
}