Spring Data JPA 查询

小编 2026-06-09 阅读:1897 评论:0
Spring Data的核心接口是Repository。我们来看一下最基本的CrudRe...

Spring Data的核心接口是Repository。我们来看一下最基本的CrudRepository 接口:

public interface CrudRepository<T, ID extends Serializable>    extends Repository<T, ID> {    <S extends T> S save(S entity);     T findOne(ID primaryKey);           Iterable<T> findAll();              Long count();                       void delete(T entity);              boolean exists(ID primaryKey);      // … 其他的省略}

他们的作用显而易见,分别是保存、查找、全部、数量、删除和判断是否存在 。

 

其他的接口,比如JpaRepository 和MongoRepository 都是定向扩展了的,都继承自CrudRepository接口。还有一个 PagingAndSortingRepository接口增加了分页功能:

public interface PagingAndSortingRepository<T, ID extends Serializable>  extends CrudRepository<T, ID> {  Iterable<T> findAll(Sort sort);  Page<T> findAll(Pageable pageable);}

 如果想要访问第二页的10个,可以这样做:

PagingAndSortingRepository<User, Long> repository =  … Page<User> users = repository.findAll(new PageRequest(1, 10));

 注意参数的值。

 

要使用我们自己编写的Repository,需要在SPring中启动它:

 

import org.springframework.data.jpa.repository.config.EnableJpaRepositories;@EnableJpaRepositoriesclass Config {}

 这里没有指定包名,所以根据类判断默认包。如果需要修改,可以传入参数:

@EnableJpaRepositories(basePackages={"com.pretty.awsome"})

 传入一个不需要使用大括号(也不用参数名),多个可以使用数组。

 

 然后获取实例:

public class SomeClient {  @Autowired  private MyRepository repository;}

 

 

对于创建查询,Spring Data 使用了一个“约定”模式:使用By、And、Or、Distinct、IgnoreCase、OrderBy等。比如

 

public interface CityRepository extends Repository<City, Long> {    Page<City> findAll(Pageable pageable);    City findByNameAndStateAllIgnoringCase(String name, String state);    }

 我们定义了一个City实体,有两个属性: name 和state。对于方法findByNameAndStateAllIgnoringCase必需使用这样的名字,如果改成诸如

findByNameAndCountryAllIgnoringCase

 这样就会报错,说找不到country属性。

 

下面列一些模式:

public interface PersonRepository extends Repository<User, Long> {  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);  List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);  List<Person> findByLastnameIgnoreCase(String lastname);  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);  List<Person> findByLastnameOrderByFirstnameDesc(String lastname);  List<Person> findByAddressZipCode(ZipCode zipCode);}

 最下面一个是级联查询,返回的是满足x.address.zipCode==zipCode的Person List。算法会首先查询是否有addressZipCode属性,发现没有,于是从右边开始根据驼峰进行拆分(变成了addressZip和code)发现也没有,于是移动拆分点,匹配成功。(是不是很蛋疼?不过熟练的话真的很好啊)

好了我们继续往下走,好吧?等等,好像还有问题:如果Person真的有addressZip属性怎么办(我们的目的却没变,还是根据zipCode查找),他会说“天哪找不到code属性,你丫写错了肯定”。这时候可以(而且建议)使用下划线:

List<Person> findByAddress_ZipCode(ZipCode zipCode);

 所以我们在属性命名的时候要用驼峰而不是下划线。

 

现在我们使用limit查询,主演是First和Top:

User findFirstByOrderByLastnameAsc();User findTopByOrderByAgeDesc();Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);Slice<User> findTop3ByLastname(String lastname, Pageable pageable);List<User> findFirst10ByLastname(String lastname, Sort sort);List<User> findTop10ByLastname(String lastname, Pageable pageable);

 是不是很神奇(Page和Slice的区别就像List和Iterator,所以量大的时候用Slice).

 

我正在学习中,对一些概念也不太了解。大家有新见解请留言,有疑问可以参考http://docs.spring.io/spring-data/data-commons/docs/1.11.0.RELEASE/reference/html/

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表