Spring Data JPA 映射VO/DTO对象方式

目录
  • Spring Data JPA 映射VO/DTO对象
    • HQL方式
    • 原生SQL的形式
  • Spring Data Jpa 自定义repository转DTO

Spring Data JPA 映射VO/DTO对象

在项目开发中,时常需要根据业务需求来映射VO/DTO对象(这两个概念理解感觉很模糊- 。- ),本文将简单介绍以Spring Data JPA的方式处理实体类映射

HQL方式

public interface MusicTypeRepository extends JpaRepository<MusicType,Integer> {
     @Query("select new cn.srblog.springbootcurd.vo.StudentTypeInfoVo(count(s.id),m.name) " +
             "FROM MusicType m  left JOIN Student s on s.musicTypeId = m.id group by m.id ")
     List<StudentTypeInfoVo> getTypeInfo();
}
  • 填写实体类路径,构造参数顺序要一致,字段名一律为实体类中的属性
  • 如果配置了实体类属性的映射关系,则on s.musicTypeId = m.id语句可以省略

VO实体类

@Value
public class StudentTypeInfoVo  {
    private Long count;
    private String name;
}

使用Lombok的 @Value 注解

  • 默认生成带参构造方法
  • 默认为成员变量添加final修饰,且只提供getter()方法

原生SQL的形式

接口形式

public interface CoursePlanRepository extends JpaRepository<CoursePlan,Integer> {
       @Query(nativeQuery = true,value = "SELECT " +
               " c.id as id," +
               "DAYOFWEEK(c.start_time) as week," +
               "m.name as musicType," +
               "t.name as teacherName," +
               "c.start_time as startTime," +
               "c.end_time as endTime " +
               " FROM t_courseplan c,t_musictype m , t_teacher t " +
               " WHERE DATE(c.start_time) < DATE_ADD(CURDATE(), INTERVAL 7 DAY ) AND CURDATE() <= DATE(c.start_time) " +
               " and t.id=c.tea_id and c.music_type_id = m.id order by c.start_time ")
       List<CoursePlanVos> getWeekList();
}
  • nativeQuery = true 表示开启原生SQL查询
  • 查询字段别名需要与实体类中字段一一对应
  • 该方法功能为查询一周后的数据
函数 说明
DAYOFWEEK() DAYOFWEEK函数返回日期的工作日索引值,即星期日为1,星期一为2,星期六为7。例:DAYOFWEEK('2019-05-09') 返回 5
DATE() 提取日期或日期/时间表达式的日期部分,格式'YYYY-MM-DD'或者'YYYYMMDD'
DATE_ADD(date,INTERVAL expr unit) 给日期添加指定的时间间隔。date 参数是合法的日期表达式,expr 参数是您希望添加的时间间隔,type 参数可以是MySQL支持的时间日期相关类型值
CURDATE() 返回当前日期 例:'2019-05-09'

VO实体类(接口形式)

public interface CoursePlanVos{
    Integer getId();
    Integer getWeek();
    String getMusicType();
    String getTeacherName();
    Date getStartTime() ;
    Date getEndTime();
}

结果集形式

@Query(value = "select count(s.id) as count,m.name as name " +
             " FROM t_musictype m  left JOIN t_student s on s.music_type_id = m.id group by m.id ",nativeQuery = true)
    List<Object[]> listType1();

对比第一种方法,使用原生SQL默认会返回Object数组

Spring Data Jpa 自定义repository转DTO

近期项目中需要 关联 几张表再把字段转出来,在这里记录以下,我感觉网上写的都不太规范和清晰。

@Entity
@SqlResultSetMapping(
        name="TestMapping",
        entities = {
                @EntityResult(
                        entityClass = com.xxx.xx.data.model.TestEntity.class,
                        fields = {
                                @FieldResult(name="id",column="id"),
                                @FieldResult(name="localTime",column="time"),
                                @FieldResult(name="maximumAppointment",column="maxAppointment"),
                        }
                )
        }
)
@NamedNativeQuery(name="getTestQuery",
        query="select tableC.id as id,tableB.time,tableC.maximumAppointment as maxAppointment from tableB " +
                "                              inner join tableA on tableA.id = tableB.tableAId " +
                "                              inner join tableC on tableB.id = tableC.tableBId " +
                "                              inner join custom on custom.id = tableA.customId " +
                "where " +
                "   tableA.locationId = :locationId" +
                "   and custom.id = :customId" +
                "   and tableB.deleted = false ", resultSetMapping="TestMapping")
@Data
public class TestEntity {
    @Id
    private String id;
    private LocalTime localTime;
    private Integer maximumAppointment;
}

需要声明接口:

@Repository
public interface TestEntityRepository extends JpaRepository<TestEntity,String> {
    @Query(name="getTestQuery")
    List<TestEntity> getTestQuery(String locationId, String customId);
}

若不想声明接口,那可以用EntityManager 来实现。

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Data Jpa实现自定义repository转DTO

    近期项目中需要 关联 几张表再把字段转出来,在这里记录以下,我感觉网上写的都不太规范和清晰. @Entity @SqlResultSetMapping( name="TestMapping", entities = { @EntityResult( entityClass = com.xxx.xx.data.model.TestEntity.class, fields = { @FieldResult(name="id",column="id")

  • spring data jpa 查询自定义字段,转换为自定义实体方式

    目标:查询数据库中的字段,然后转换成 JSON 格式的数据,返回前台. 环境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2 背景:首先建立 entity 映射数据库(非专业 java 不知道这怎么说) @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long

  • 使用Spring Data JPA的坑点记录总结

    前言 Spring-data-jpa的基本介绍:JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现.在ORM框架中,Hibernate是一支很大的部队,使用很广泛,也很方便,能力也很强,同时Hibernate也是和JPA整合的比较良好,我们可以认为JPA是标准,事实上也是,JPA几乎都是接口,实现都是Hibernate在做,宏观上面看,在JPA的统一之下Hibernate很良好的运行. 最近在

  • 详解Spring Data JPA系列之投影(Projection)的用法

    本文介绍了Spring Data JPA系列之投影(Projection)的用法,分享给大家 在JPA的查询中,有一个不方便的地方,@Query注解,如果查询直接是 Select C from Customer c ,这时候,查询的返回对象就是Customer这个完整的对象,包含所有字段,对于我们的示例并没有什么问题,但是对于比较庞大的domain类,这个查询时就比较要命,并不是所有的字段都能用到,比较头疼.另外,如果定义 select c.firstName as firstName,c.la

  • Spring Data JPA 映射VO/DTO对象方式

    目录 Spring Data JPA 映射VO/DTO对象 HQL方式 原生SQL的形式 Spring Data Jpa 自定义repository转DTO Spring Data JPA 映射VO/DTO对象 在项目开发中,时常需要根据业务需求来映射VO/DTO对象(这两个概念理解感觉很模糊- .- ),本文将简单介绍以Spring Data JPA的方式处理实体类映射 HQL方式 public interface MusicTypeRepository extends JpaReposito

  • Spring Data Jpa的四种查询方式详解

    这篇文章主要介绍了Spring Data Jpa的四种查询方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> 使用这

  • Spring Data JPA映射自定义实体类操作

    目录 Spring Data JPA映射自定义实体类 JPA 配置类实体映射示例 Spring Data JPA映射自定义实体类 这个问题困扰了我2天=-=,好像也能使用 jpql解决 先说下自己的功能:查询oracle最近sql执行记录 sql很简单:[如果需要分页,需要自己手动分页,因为你使用分页工具他第一页查询不会查询rownum,第二页查询就会查询rownum,然而这个返回的List<Object[]>中的参数必须要和实体类中一一对应,所以这就有一个不可控制的属性rownum,所以我们

  • Spring DATA JPA 中findAll 进行OrderBy方式

    目录 Spring DATA JPA 中findAll 进行OrderBy Spring Data JPA使用orderby的一个小坑 Spring DATA JPA 中findAll 进行OrderBy 需要在 repository 中 定义这样的方法 :findAllByOrderByUpdatedAtDesc() public List findAllByOrderByUpdatedAtDesc(); 重要:(中间要多加一个By) findAllByOrderByUpdatedAtDesc

  • Spring Data JPA 设置字段默认值方式

    目录 Spring Data JPA设置字段默认值 Spring Data JPA设置字段默认值失败 Spring Data JPA设置字段默认值 在Column注解中写入以下两个属性,为什么自己查一下文档吧,即可实现字段默认值设置,并顺带解决save方法所生成的sql语句中自动填充字段为null的问题. 默认值无法更新,所以如果想在代码里修改字段默认值,你需要重新建表. @Column(insertable = false,columnDefinition = "int default 1&q

  • Spring Data JPA 实现多表关联查询的示例代码

    多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果,这里介绍第二种方式. 一.一对一映射 实体 UserInfo :用户. 实体 Address:家庭住址. 这里通过外键的方式(一个实体通过外键关联到另一个实体的主键)来实现一对一关联. 实体类 1.实体类 UserInfo.java package com.johnfnash.learn.domain; import java.io.Ser

  • 在Spring Data JPA中引入Querydsl的实现方式

    一.环境说明 基础框架采用Spring Boot.Spring Data JPA.Hibernate.在动态查询中,有一种方式是采用Querydsl的方式. 二.具体配置 1.在pom.xml中,引入相关包和配置插件. (1)引入包(注:不需要版本号,Spring Boot 会自动匹配合适的版本) <!-- Querydsl相关包 --> <dependency> <groupId>com.querydsl</groupId> <artifactId&

  • spring boot之使用spring data jpa的自定义sql方式

    目录 spring data jpa介绍 自定义SQL查询 jpa两种自定义SQL的方式 1. 原生SQL 2. 实体类SQL spring data jpa介绍 PA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面.值得注意的是,JPA是在充分吸收

  • Spring Data JPA查询方式及方法名查询规则介绍

    目录 Spring Data JPA查询方式及方法名查询规则 一.通过解析方法名创建查询 二.使用 @Query 创建查询 JPA 常用查询方法记录 CrudRepository 默认带的查询方法 简单的扩展-以字段为关键字进行查询 使用@Query 进行复杂查询 使用 Specification 进行复杂查询 Predicate CriteriaBuilder Root Spring Data JPA查询方式及方法名查询规则 Spring Data JPA 一.通过解析方法名创建查询 在执行查

随机推荐