接着上篇博客。上篇博客简单介绍了jpa的基本使用,以及如何根据定义方法名让jpa自动生成sql语句,这次来看看如何自定义sql语句。
jpa自定义sql语句是在方法上加上@Query注解,这和mybatis使用注解很像,不过mybatis有@Select,@Delete,@Update,@Insert 四种注解,而jpa只需要@Query。先来看一个简单的例子:
@Query(value = "select u from User u where u.username= ?1")
User findByUsername2(String username);
在默认的情况下,jpa不允许你使用“*”,也就是说不能出现 select * from... ,这样的语句,jpa会报错,还有一个就是这里的User需要首字母大写。不能使用* 我们一般会在给表取个别名,用别名代替*,如上面的例子所示。
如果非要使用*,可以在后面加上 nativeQuery = true,例子如下:
@Query(value = "select * from User u where u.username= ?1",nativeQuery = true)
User findByUsername2(String username);
加上nativeQuery的意思就是使用原生的sql,不需要jpa为我们做处理。
接下来看一下分页,在做项目的过程中,由于数据量会特别大,对于前端过来的请求一般都会要求分页,减轻压力。jpa使用分页的类是pageable,来看个例子:
Pageable pageable = PageRequest.of(1,10);
1表示当前的页数(即第一页),10表示每页的大小,取值的时候每次取一页,所以可以认为每次取10个。这个pageable表示取pageRequest.of()方法可以重载许多不同类型的参数,如果需要为数据库中的某个字段进行排序,可以这么做:
Sort sort = new Sort(Sort.Direction.DESC,"id");
Pageable pageable = PageRequest.of(1,10,sort);
“id”表示按照数据库中的id字段进行排序,DESC表示倒序。
@Query(value = "select * from user where username= ?1",
countQuery = "select count(*) from user where username = ?1",
nativeQuery = true
List<User> findByUsername(String username, Pageable pageable);
查询讲完了,来看看其他的增删改。
这三种操作会修改数据库,我们需要添加@Modify注解,为了防止异常,还需要加上事务注解@Transactional,说到事务关于jpa的事务下次再讲,先来看看这几种基本操作。
对于更新,由于jpa的save()方法包含了merge,所以对于传进来的对象,如果数据库中没有相应的主键(这里就是id),就会执行insert操作,如果数据库中有对应的主键,jpa就会执行update操作。
删除操作:可以自动生成,加上@Transactional注解
@Transactional
void deleteById(int id);
上面所有的示例看上去都能正常运行,但是到了真实开发环境时,会 出现问题,真实项目场景中,每一张表的字段以及数据都会非常的大,这个时候我们就需要取出数据库中我们所需要的某些字段,而不需要取出所有的字段。但是jpa会默认取出数据库中所有的字段,当返 回值类型为entity类时,会把数据库中所有的字段(即使你的sql语句只查询了部分字段)数据自动封装成entity对象,然后返回。
1、 这个时候我们可以自定义dto对象来查询
@Query(value = "select new 包名.MyModel(u.userName, ui.name, ui.gender, ui.description) from UserInfo ui, User u where u.id = ui.userId")
public List<MyModel> getAllRecord();
自定义entity代码如下
public class MyModel implements Serializable {
private String userName;
private String name;
private String gender;
private String description;
public MyModel() {};
public MyModel(String userName, String name, String gender, String description) {
this.userName = userName;
this.name = name;
this.gender = gender;
this.description = description;
2、还有一种解决方案就是直接返回 一个map对象
类似于这样
@Query(value = "select new map(u.userName, ui.name, ui.gender, ui.description) from UserInfo ui, User u where u.id = ui.userId")
public List<Map<String, Object>> getCustomField();
接着上篇博客。上篇博客简单介绍了jpa的基本使用,以及如何根据定义方法名让jpa自动生成sql语句,这次来看看如何自定义sql语句。 jpa自定义sql语句是在方法上加上@Query注解,这和mybatis使用注解很像,不过mybatis有@Select,@Delete,@Update,@Insert 四种注解,而jpa只需要@Query。先来看一个简单的例子: ...
本页将介绍使用 Spring Data JPA + MySQL 数据库进行 Spring Boot 分页和排序。当我们拥有大型数据集时,分页将提高应用程序的性能。它将数据集的较小块呈现给用户。
Spring Data JPA 提供了PagingAndSortingRepository扩展接口CrudRepository以在 Spring Boot 应用程序中实现分页和排序。接口中声明了两个方法PagingAndSortingRepository:
Iterable<T> findAll(S.
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.p
在本教程中,我们将扩展spring boot CRUD web 应用程序,并使用 spring boot、thymeleaf、spring data JPA、Hibernate 和 MySQL 数据库实现分页和排序操作。
如您所知,分页允许用户一次查看一小部分数据(一页),排序允许用户以更有条理的方式查看数据。分页和排序都可以帮助用户更轻松、更方便地消费信息。
让我们从可以从本教程下载的员工
select d.id,d.name,d.description,d.parent_id,temp.name as parent_name
from department d,department temp
where d.parent_i...
@Query自定义 分页查询加like模糊查询加in查询
//分页查询,第一页从0开始,Sort.by按字段排序
Pageable pageable = PageRequest.of(0, limit, Sort.by("name").ascending());
@Query(value = "SELECT * FROM table WHERE group_id = ?1 AND severity IN ?2 AND cluster IN ?3 AND (name LIKE %?4
JPA框架通过解析方法名称的方式生成对应的SQL,极大减少了开发工作量,JPA满足于通用情况下的简单开发工作,一些麻烦的业务情况则需手写SQL实现,JPQL应用于这种复杂场景。JPQL与SQL的区别 - SQL是面向数据库,其操作的是数据表和数据列 - JPQL操作的是实体对象和实体属性 具体应用 JPQL 语句基本格式
select 实体别名.属性名 from 实体名 实体别名 where 实体别名.实体属性 = xxx
刚进项目实习生,积累经验,欢迎交流。
周末在写毕业中遇到一个很糟心的事情:jap中用了分页查询,结果项目一直没起得来,找了半天也没有找到原因,
之后周一晚上无意找到了解决方案,并发现一个很有意思的事情。
报错 以及 关键代码 :
三月 13, 2017 6:31:13 下午 org.apache.catalina.core.StandardContext listenerStart
@Query(value = "SELECT * FROM table_name WHERE condition = ?1 ORDER BY id DESC", countQuery = "SELECT COUNT(*) FROM table_name WHERE condition = ?1", nativeQuery = true)
Page<Entity> findByCondition(String condition, Pageable pageable);
其中,value属性为原生SQL语句,countQuery属性为查询总数的SQL语句,nativeQuery属性为true表示使用原生SQL查询。Pageable参数用于指定分页信息,包括页码、每页数量、排序等。