Spring Data Jpa findBy的使用注意

Spring Boot Jpa 使用findBy报错Jpa Failed to create query for method public abstract com.zhl.internback.domain.Student com.zhl.internback.repository.StudentRepository.findByStunum(int)!

下面这段是小白理解,望指正:
Jpa的findBy对于常用的字段名(比如name,password,id等)是有自动生成sql语句的方法的,但对于用户自定义的字段名,无法自己识别,需要我们使用@query注解去手动添加sql语句,@query的用法如下:

  1. 一个使用@Query注解的简单例子

@Query(value = “select name,author,price from Book b where b.price>?1 and b.price<?2”)
List findByPriceRange(long price1, long price2);

  1. Like表达式

@Query(value = “select name,author,price from Book b where b.name like %:name%”)
List findByNameMatch(@Param(“name”) String name);

  1. 使用Native SQL Query

所谓本地查询,就是使用原生的sql语句(根据数据库的不同,在sql的语法或结构方面可能有所区别)进行查询数据库的操作。
@Query(value = “select * from book b where b.name=?1”, nativeQuery = true)
List findByName(String name);

  1. 使用@Param注解注入参数

@Query(value = “select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price”)
List findByNamedParam(@Param(“name”) String name, @Param(“author”) String author,
@Param(“price”) long price);

  1. SPEL表达式(使用时请参考最后的补充说明)

'#{#entityName}'值为’Book’对象对应的数据表名称(book)。
public interface BookQueryRepositoryExample extends Repository<Book, Long>{
@Query(value = “select * from #{#entityName} b where b.name=?1”, nativeQuery = true)
List findByName(String name);
}

  1. 一个较完整的例子

public interface BookQueryRepositoryExample extends Repository<Book, Long> {
@Query(value = “select * from Book b where b.name=?1”, nativeQuery = true)
List findByName(String name);// 此方法sql将会报错(java.lang.IllegalArgumentException),看出原因了吗,若没看出来,请看下一个例子
@Query(value = “select name,author,price from Book b where b.price>?1 and b.price<?2”)
List findByPriceRange(long price1, long price2);
@Query(value = “select name,author,price from Book b where b.name like %:name%”)
List findByNameMatch(@Param(“name”) String name);
@Query(value = “select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price”)
List findByNamedParam(@Param(“name”) String name, @Param(“author”) String author,
@Param(“price”) long price);
}

  1. 解释例6中错误的原因:

    因为指定了nativeQuery = true,即使用原生的sql语句查询。使用java对象’Book’作为表名来查自然是不对的。只需将Book替换为表名book。
    @Query(value = “select * from book b where b.name=?1”, nativeQuery = true)
    List findByName(String name);

参考文章https://www.cnblogs.com/zj0208/p/6008627.html.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值