添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

引言:JPA与SpringData中提供了诸多非常便利的方法,这里以如何以不书写SQL的方式来实现单条记录的查询。

repositories.limit-query-result

这个标题为Spring Data提供了内置功能,这些查询方法需要使用first/top等关键词,这两个关键词是彼此可以替代的。
可选的数字值用以表示最大可以返回的记录条数,一般都是放在first/top的右边。

Example 15. Limiting the result size of a query with Top and First

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

其中也是支持Distinct关键词的,限定词也可以支持Optional之类的关键词。
参考资料: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result

@Entity
@Table(name="t_user")
@Data
@EqualsAndHashCode(callSuper=true)
public class UserEntity extends BaseEntity {
    @Column(name="pin_key")
    private String userKey;
    @Column(name="device_type")
    private String deviceType;
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "created_time")
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdTime;
    @Column(name = "updated_time")
    @Temporal(TemporalType.TIMESTAMP)
    @Version
    private long version;

Repository的代码:

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {
    public UserEntity findFirstByOrderByCreatedTimeDesc();

Service的示例代码:

@Slf4j
@Service
public class DemoService {
    @Autowired
    private UserRepository userRepo;
    .....
    public UserEntity getLatestUser() {
        return this.userRepo.findFirstByOrderByCreatedTimeDesc();

Controller的代码示例:

@Slf4j
@RestController
public class TestController {
    @Autowired
    private DemoService demoService;
    @GetMapping("/test/user")
    public String getUser() {
        UserEntity user = this.userRepo.findFirstByOrderByCreatedTimeDesc();
       log.info("userInfo:" + ReflectionToStringBuilder.toString(user));
       return user.toString();

然后直接在浏览器打开连接就可以直接访问。
其余相关的配置项由于篇幅所限,就不在一一的黏贴拷贝了。

Spring Data提供了大量非常好用的缺省实现,对于开发者而言直接使用即可,从而可以提升开发效率,充分体现瑞士军刀的锋利与效率。

第1章 Specifications动态查询 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA可以通过JpaSpecificationExecutor接口查询。相比JPQL,其优势是类型安全,更加的面向对象。 import java.util.List; import org.springframework.data.dom...
一、什么是jpa JPA本身不是一个工具或框架; 相反,它定义了一组可以由任何工具或框架实现的概念。虽然JPA的对象关系映射(ORM)模型最初基于Hibernate,但它已经发展了。简单来说,JPA只是一个简化对象关系映射来管理Java应用程序的关系数据的规范。 它提供了一个平台,可以直接使用对象而不是使用SQL语句。 二、什么是Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,是一个全自动的ORM框架,它可以自动生成SQL语句,自动执
在前面的章节已经讲述了SpringDataJpa的CRUD操作以及其底层代理实现的分析,下面介绍SpringDataJpa的复杂查询和动态查询,多表查询。 文章目录1.复杂查询i.方法名称规则查询ii.JPQL查询iii.SQL查询2.动态查询i.为什么需要动态查询ii.JpaSpecificationExecutor定义的方法1)单条查询2)多条件查询3)模糊查询4)分页查询5)对查询结果进行排序3.多表查询i.建立表与表之间的关系 1.复杂查询 i.方法名称规则查询 方法名查询:只需要按照Spr
今天在做一个Query查询时,数据库只有一条,却在封装的查询语句查询出多条出来,百思不得解,开始以为是Query封装出了问题,后来测试后发现没问题,然后想到在控制台查看是否输出了多条查询语句,还真是。 然后想到了对象关联问题: @Fetch(FetchMode.JOIN) 会使用left join查询 只产生一条sql语句 @Fetch(FetchMode.SELECT) 会产生N+1...
今天后端框架做了一个版本的升级,SpringBoot升级到了2.1.0 版本,随之JPA也进行了一个版本的升级。 对代码比较大的一个改变是查询单条数据的方法,在2.0之前JPA是findOne(id), 在2.0以后JPA是 findById()方法。 因而我写了下面这段代码 在浏览器上测试一下这个接口。报了下面这个错,出错的原因是 当前我的表里面没有id 为10的数据。
文章目录一、JPA自定义查询方法1.1 单条查询一条数据1.2 单条查询多条数据1.3 多条件查询数据1.4 查询某一个字段1.5 in查询1.6 like查询二、自定义sql查询2.1 单条查询2.2 多条件查询2.3 复杂多条件查询2.4 根据id修改数据 一、JPA自定义查询方法 方法名需要按指定规则来起: 单条数据:find+by+对象属性名 多条数据:findAll+by+对象属性名 1.1 单条查询一条数据 1.2 单条查询多条数据 1.3 多条件查询数据 1.4 查询
MySQL之[42000][1055] Expression #1 of SELECT list is not in GROUP BY clause问题 2301_81433086: select home_address, count(id) from t_user where sex = 0 group by home_address having count(id)>0; Scrapy之CsvItemExporter生成的CSV文件乱码解决 m0_70996615: 感谢大佬 解决了乱码也能能够写入了!! 异常信息ASM ClassReader failed to parse class file的问题解决 二哥别秀了: 我jdk回退到7还是没有用,报一样的错误 Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow Emotionormal: 用pip search xx 也找不到是什么原因 Maven之java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags异常分析 飞机火车巴雷特: 我是遇到这个问题的时候也是该了jdk版本就解决了。备注:从jdk11改为jdk8.