接着上篇博客。上篇博客简单介绍了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参数用于指定分页信息,包括页码、每页数量、排序等。