Spring boot JPA实现分页和枚举转换代码示例

1.实现分页

方法一:使用Pageable

使用Pageable作为入参传入Repository,返回值用Page<T>接收

UserRepository

package com.kinglead.demo.dao;
 ​
 import com.kinglead.demo.entity.User;
 import org.springframework.data.jpa.repository.JpaRepository;
 ​
 public interface UserRepository extends JpaRepository<User, Long> {
 }

UserServiceImpl

package com.kinglead.demo.service.impl;
 ​
 import com.kinglead.demo.dao.UserRepository;
 import com.kinglead.demo.entity.User;
 import com.kinglead.demo.service.UserService;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 ​
 import javax.annotation.Resource;
 ​
 @Service
 public class UserServiceImpl implements UserService {
 ​
   @Resource
   private UserRepository userRepository;
 ​
   /**
   * 查询用户列表
   */
   @Override
   public Page<User> queryAll(Pageable pageable) {
     return userRepository.findAll(pageable);
   }
 ​
 }

UserService

package com.kinglead.demo.service;
 ​
 import com.kinglead.demo.entity.User;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 ​
 import java.util.List;
 import java.util.Map;
 ​
 public interface UserService {
   /**
   * 查询用户列表
   */
   Page<User> queryAll(Pageable pageable);
 }

Controller

/**
 * 查询用户列表
 */
 @GetMapping("/userList")
 public Page<User> queryAll(){
   //注意,前端页面的页面是从1开始,而JPA是从0开始
   Pageable pageable = PageRequest.of(0,5);
   //查询用户列表
   return userService.queryAll(pageable);
 }

方法二:以元模型概念为基础的Criteria 查询方法

UserRepository额外继承JpaSpecificationExecutor<>

package com.kinglead.demo.dao;
 ​
 import com.kinglead.demo.entity.User;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 ​
 public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
 }

UserServiceImpl

/**
   * 查询用户列表
   */
   @Override
   public Page<User> queryAll(String name,String age,Pageable pageable) {
       Specification<User> specification = (Specification<User>)(root, query, criteriaBuilder) ->{
         List<Predicate> list = new ArrayList<>();
         // 第一个name为User实体对象中的字段,第二个name为参数
         Predicate p1 = criteriaBuilder.equal(root.get("name"),name);
         list.add(p1);
 //        if (!age.equals(null)) {
 //          // 此处为查询serverName中含有age的数据
 //          Predicate p2 = criteriaBuilder.like(root.get("age"),"%"+age+"%" );
 //          list.add(p2);
 //        }
         return criteriaBuilder.and(list.toArray(new Predicate[0]));
       };
       return userRepository.findAll(specification,pageable);
   }

其它代码如方法一,不用动。

2.枚举转换

**方法一:实体类加@Enumerated注解

package com.kinglead.demo.enums;

import com.fasterxml.jackson.annotation.JsonValue;

public interface BaseEnum<K> {

  /**
   * 真正与数据库进行映射的值
   *
   * @return
   */
  K getCode();

  /**
   * 显示的信息
   *
   * @return
   */
  @JsonValue //jackson返回报文response的设置
  String getDisplayName();
}
package com.kinglead.demo.enums;
 ​
 public enum GenderEnum implements BaseEnum<String> {
 ​
   MALE("MALE","男"),
   FEMALE("FEMALE","女");
 ​
 ​
   private final String code;
   private final String displayName;
 ​
   GenderEnum(String code, String displayName) {
     this.code = code;
     this.displayName = displayName;
   }
 ​
   @Override
   public String getCode() {
     return code;
   }
 ​
   @Override
   public String getDisplayName() {
     return displayName;
   }}
package com.kinglead.demo.entity;
 ​
 import com.kinglead.demo.enums.GenderEnum;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 ​
 import javax.persistence.*;
 import java.io.Serializable;
 ​
 @Data //添加getter、setter方法
 @NoArgsConstructor  //无参构造函数
 @AllArgsConstructor //所以参数构造函数
 @Entity //声明为JPA实体
 @Table(name = "t_user") //该标注与@Entity标注并列使用,用于指明数据库的表名
 public class User implements Serializable {
   private static final long serialVersionUID = -21070736985722463L;
 ​
   @Id //指明主键
   @GeneratedValue(strategy= GenerationType.AUTO)
   private Long id;
 ​
   @Column(name = "name", columnDefinition = "姓名") //指明字段
   private String name;
 ​
   @Column(name = "age", columnDefinition = "年龄") //指明字段
   private Long age;
 ​
   @Column(name = "email", columnDefinition = "邮箱") //指明字段
   private String email;
 ​
   @Column(name = "gender", columnDefinition = "性别") //指明字段
   @Enumerated(EnumType.STRING)
   private GenderEnum gender;
 ​
 }

方法二:使用jpa2.1规范里面的属性转换器

将方法一中实体对象User的gender成员变量上的注解@Enumerated(EnumType.STRING)去掉

package com.kinglead.demo.config;
 ​
 import com.kinglead.demo.enums.GenderEnum;
 ​
 import javax.persistence.AttributeConverter;
 import javax.persistence.Converter;
 ​
 @Converter(autoApply = true)
 public class ColorConverter implements AttributeConverter<GenderEnum,String> {
 ​
   @Override
   public String convertToDatabaseColumn(GenderEnum attribute) {
     return attribute.getCode();
   }
 ​
   @Override
   public GenderEnum convertToEntityAttribute(String dbData) {
     return GenderEnum.valueOf(dbData);
   }
 }

上面的转换器只是针对某一种枚举进行转换,如果写成通用的转换器呢,后续研究

源码地址:https://github.com/kinglead2012/myblog

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • IDEA+maven+SpringBoot+JPA+Thymeleaf实现Crud及分页

    一.开发环境: 1.windows 7 企业版 2.IDEA 14 3.JDK 1.8 4.Maven 3.5.2 5.MariaDB 6.SQLYog 二.Maven设置: Maven目录下的conf目录下的settings.xml做如下内容的添加: 1.使用阿里云的仓库,比官网访问速度快很多 <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexu

  • SpringBoot JPA实现增删改查、分页、排序、事务操作等功能示例

    今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查.分页.排序.事务操作等功能. 下面先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex): public List<User> findByHeightAndSex(int height,char sex); // Or --- 等价于 SQL 中的 or 关键字,比如 findByHei

  • SpringBoot Jpa分页查询配置方式解析

    这篇文章主要介绍了SpringBoot Jpa分页查询配置方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 这是已经被废弃的接口 Sort sort = new Sort(Sort.Direction.DESC,"bean类中字段"); //创建时间降序排序 Pageable pageable = new PageRequest(pageNumber,pageSize,sort); 上面的用法在最新的SpringBoot中已经不

  • 在Spring Boot中使用Spring-data-jpa实现分页查询

    在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式. 1.引入起步依赖   <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency&

  • SpringBoot整合spring-data-jpa的方法

    jpa是JavaEE定义的一种规范,常用的实现一般是Hibernate,而spring-data-jpa则是对jpa的又一层封装,提供了更多便捷的方法. 这里不会深入讲解spring-data-jpa的使用,只是讲解怎么快速的整合使用,目的是帮助那些想学,但是在整合上老是翻车的同学 导入依赖 <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> &

  • SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页详解

    一. 使用Springboot+Jpa实现对mysql数据库的增删改查和分页功能 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 使用Springboot和jpa对数据库进行操作时,能够大大减少我们的工作量,在jpa中,已经在底层封装好了增删查的功能和sql语句,可以使我们进行快速开发 二.项目过程和配置文件 1.applaction.properties文件配置

  • Spring Boot2.x集成JPA快速开发的示例代码

     什么是JPA 一种规范,并非ORM框架,也就是ORM上统一的规范 spring-boot-starter-data-jpa 是Spring Boot的项目,包含了spring-data-jpa和一些其他依赖用于Spring Boot项目 spring-data-jpa 是Spring Data的项目,就是本体,用于任何项目 解决 为了执行简单查询分页,编写太多重复代码 基于JPA的数据访问层的增强支持 用了之后可以做什么,为什么要用?如下代码解释 实体类 package com.example

  • SpringBoot整合JPA数据源方法及配置解析

    一.创建项目并导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dr

  • SpringBoot2.3.0配置JPA的实现示例

    JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 依赖 spring-boot-starter-data-jdbc spring-boot-starter-data-jpa mysql-connector-java <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g

  • Spring boot JPA实现分页和枚举转换代码示例

    1.实现分页 方法一:使用Pageable 使用Pageable作为入参传入Repository,返回值用Page<T>接收 UserRepository package com.kinglead.demo.dao; ​ import com.kinglead.demo.entity.User; import org.springframework.data.jpa.repository.JpaRepository; ​ public interface UserRepository exte

  • Spring Data JPA实现分页Pageable的实例代码

    在JPA中提供了很方便的分页功能,那就是Pageable(org.springframework.data.domain.Pageable)以及它的实现类PageRequest(org.springframework.data.domain.PageRequest),详细的可以见示例代码. 1.改变CustomerRepository方法​ /** * 一个参数,匹配两个字段 * @param name2 * @Param pageable 分页参数 * @return * 这里Param的值和

  • 详解spring boot jpa整合QueryDSL来简化复杂操作

    前言 使用过spring data jpa的同学,都很清楚,对于复杂的sql查询,处理起来还是比较复杂的,而本文中的QueryDSL就是用来简化JPA操作的. Querydsl定义了一种常用的静态类型语法,用于在持久域模型数据之上进行查询.JDO和JPA是Querydsl的主要集成技术.本文旨在介绍如何使用Querydsl与JPA组合使用.JPA的Querydsl是JPQL和Criteria查询的替代方法.QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查

  • Spring Data Jpa实现分页和排序代码实例

    之前我们学习了如何使用Jpa访问关系型数据库.通过Jpa大大简化了我们对数据库的开发工作.但是,之前的例子中我们只提到了最简单的CRUD(增删改查)操作.实际上,Spring Data Jpa对于分页以及排序的查询也有着完美的支持,接下来,我们来学习如何通过Pageable来对数据库进行分页查询. 添加maven依赖 首先我们需要引入Jpa,数据库直接使用hsqldb内存数据库就可以了: <project xmlns="http://maven.apache.org/POM/4.0.0&q

  • Spring Boot JPA如何把ORM统一起来

    JPA介绍 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面.值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点.从目前的开发社区的反应上看,JPA受到了

  • Spring boot jpa 删除数据和事务管理的问题实例详解

    今天我们介绍的是jpa删除和事务的一些坑,接下来看看具体内容. 业务场景(这是一个在线考试系统)和代码:根据问题的id删除答案 repository层: int deleteByQuestionId(Integer questionId); service 层: public void deleteChoiceAnswerByQuestionId(Integer questionId) { choiceAnswerRepository.deleteByQuestionId(questionId)

  • Spring Boot JPA访问Mysql示例

    上篇演示了通过Maven构建Spring Boot 项目,引用web模块启动应用,完成简单的web 应用访问,本章内容在此基础上面加入数据访问与端口修改,下文代码与演例(本用例纯手工测试通过,放心入坑). 修改默认端口 在src\main\resources下加入application.properties内容如下 server.port=8888 项目目录结构 启动应用,日志显示: 端口已经由默认的8080 变更为8888 JPA访问mysql数据库 1.POM中加入 <!-- Spring

  • spring boot + jpa + kotlin入门实例详解

    spring boot +jpa的文章网络上已经有不少,这里主要补充一下用kotlin来做. kotlin里面的data class来创建entity可以帮助我们减少不少的代码,比如现在这个User的Entity,这是Java版本的: @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String firstName; private S

  • Spring Boot jpa Service层代码实例

    这篇文章主要介绍了Spring Boot jpa Service层代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package com.fei.service.impl; import java.util.ArrayList; import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criter

  • Spring Boot JPA中java 8 的应用实例

    上篇文章中我们讲到了如何在Spring Boot中使用JPA. 本文我们将会讲解如何在Spring Boot JPA中使用java 8 中的新特习惯如:Optional, Stream API 和 CompletableFuture的使用. Optional 我们从数据库中获取的数据有可能是空的,对于这样的情况Java 8 提供了Optional类,用来防止出现空值的情况.我们看下怎么在Repository 中定义一个Optional的方法: public interface BookRepos

随机推荐