引言: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:
Scrapy之CsvItemExporter生成的CSV文件乱码解决
m0_70996615:
异常信息ASM ClassReader failed to parse class file的问题解决
二哥别秀了:
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Emotionormal:
Maven之java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags异常分析
飞机火车巴雷特: