Springboot Jpa自定义查询的结果集

SpringBoot Jpa实现联合查询,自定义查询后的结果集 如果要自定义查询的结果集有3种方法: 使用List<Object[]>来接收结果,只支持原生sql查询。 使用自定义对象来接收结果,支持JPA,JPQL查询。 使用自定义的接口来映射结果,支持JPA,JPQL,原生sql查询。 本章将使用原生sql实现接收联合查询后的结果集 持久层 @Repository public interface NurseDao extends JpaR... 阅读详情

如果要自定义查询的结果集有3种方法:

  1. 使用List<Object[]>来接收结果,只支持原生sql查询。
  2. 使用自定义对象来接收结果,支持JPA,JPQL查询。
  3. 使用自定义的接口来映射结果,支持JPA,JPQL,原生sql查询。

官网文档链接 https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

数据准备

entity

package com.example.demo;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/**
 * @author peter
 * 2019/1/24 14:54
 */
@Entity
@Data
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private Integer age;
    private int gender;
}

数据库

CREATE TABLE person
(
  id     BIGINT AUTO_INCREMENT
    PRIMARY KEY,
  age    INT          NULL,
  gender INT          NOT NULL,
  name   VARCHAR(255) NULL
)

INSERT INTO person(age, gender, name) VALUES (12,1,'小明');
INSERT INTO person(age, gender, name) VALUES (15,1,'小明');
INSERT INTO person(age, gender, name) VALUES (13,1,'小明');
INSERT INTO person(age, gender, name) VALUES (18,0,'小明');
INSERT INTO person(age, gender, name) VALUES (12,1,'小小');
INSERT INTO person(age, gender, name) VALUES (12,0,'小红');

使用自定义对象来接收结果

自定义的对象

package com.example.demo;
import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * @author peter
 * 2019/1/24 16:01
 */
@Data
@AllArgsConstructor
public class NameResult {
    private String name;
    private int age;
}

(1)JPA 查询

	List<NameResult> findByName(String name);

(2) JPQL 查询

	@Query("select " +
            "new com.example.demo.NameResult(name,age) " +
            "from Person where name = :name")
    List<NameResult> queryName(@Param("name") String name);
注意:new 关键字 对象必须是类的全路径。该类必须有一个全部参数的构造器。
自定义接口来映射结果
package com.example.demo;

/**
 * @author peter
 * 2019/1/24 16:09
 */
public interface NameResultInterface {
    String getName();
    int getAge();
    default String getPersonInfo(){
        return getName().concat(";")
        .concat(String.valueOf(getAge()));
    }
}

(1) JPA查询

List<NameResultInterface> findByAge(int age);

(2)JPQL查询

	@Query("select " +
            "p.name as name," +
            "p.age as age " +
            "from Person p where name = :name")
    List<NameResultInterface> queryNameInterface(@Param("name") String name);

(3) 原生sql查询

package com.example.demo;
/**
 * @author peter
 * 2019/1/24 16:32
 */
public interface PersonStatistic {
    int getGender();
    int getNum();
    default String toStringInfo() {
        return "gender=" + getGender() + "; num=" + getNum();
    }
}
	@Query(value = "select " +
            "p.gender as gender," +
            "count(p.id) AS num " +
            "from person p GROUP BY p.gender",nativeQuery = true)
    List<PersonStatistic> personStatistic();

测试类及dao层

package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

/**
 * @author peter
 * 2019/1/24 16:01
 */
@SuppressWarnings("ALL")
public interface PersonDao extends JpaRepository<Person,Long> {
    List<NameResult> findByName(String name);

    List<NameResultInterface> findByAge(int age);

    @Query("select " +
            "new com.example.demo.NameResult(name,age) " +
            "from Person where name = :name")
    List<NameResult> queryName(@Param("name") String name);

    @Query("select " +
            "p.name as name," +
            "p.age as age " +
            "from Person p where name = :name")
    List<NameResultInterface> queryNameInterface(@Param("name") String name);

    @Query(value = "select " +
            "p.gender as gender," +
            "count(p.id) AS num " +
            "from person p GROUP BY p.gender",nativeQuery = true)
    List<PersonStatistic> personStatistic();

}
package com.example.demo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * @author peter
 * 2019/1/24 16:04
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class PersonDaoTest {
    private static final String NAME = "小明";
    @Autowired
    private PersonDao personDao;
    @Test
    public void queryName() {
        List<NameResult> nameResults = personDao.queryName(NAME);
        System.out.println(nameResults);
    }
    @Test
    public void queryNameInterfaceTest() {
        List<NameResultInterface> resultInterfaces = personDao.queryNameInterface("小明");
        resultInterfaces.forEach(o -> {
            System.out.println(o.getPersonInfo());
        });
    }
    @Test
    public void findByNameTest() {
        List<NameResult> byName = personDao.findByName(NAME);
        byName.forEach(System.out::println);
    }
    @Test
    public void findByAgeTest() {
        List<NameResultInterface> byAge = personDao.findByAge(18);
        byAge.forEach(o -> {
            System.out.println(o.getPersonInfo());
        });
    }
    @Test
    public void personStatisticTest(){
        List<PersonStatistic> statistics = personDao.personStatistic();
        statistics.forEach(o->{
            System.out.println(o.toStringInfo());
        });
    }

}

demo 源码

spingboot:jpa:Spring data jpa 返回map 结果集 @PersistenceContext private EntityManager em; /** * 通过时间范围查询职位统计结果 * @param startMonth * @param endMonth * @return */ @Override public String queryP... 阅读详情

相关推荐

SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤

NotIn:等价于 SQL 中的 "not in",findByNameNotIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;In:等价于 SQL 中的 "in",findByIdIn(Collection userIdList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;也可以使用findAllBy。JPA为我们提供了分页的方法,我们可以查看接口集成的JpaRepository接口的关系图。

xxxzzzqqq_的博客 6821

Spring Boot Jpa自定义查询

有的时候,这里提供的查询关键字并不能满足我们的查询需求,这个时候就可以使用 @Query 关键字,来自定义查询 SQL

泠青沼 1245

单细胞数据互转实战:从Scanpy的h5ad到Seurat对象的四种高效方法

本文针对单细胞数据分析中Scanpy的h5ad格式与Seurat对象互转的常见难题,详细对比了SeuratDisk、anndataR、schard和sceasy四种高效转换方法。文章从实战出发,剖析了每种方法的原理、操作流程、优缺点及避坑指南,并提供了清晰的选型策略,帮助用户根据数据特点选择最佳方案,实现跨平台数据的无缝衔接。

weixin_29099217的博客 450

如何在 Spring Boot 中使用 JPA 和 JPQL 进行自定义查询示例

在本教程中,您将了解如何在 Spring Boot 示例中使用 Spring JPA @Query进行自定义查询。JPQL 与本机查询Spring JPA 同时支持 JPQL 和 Native Query。以前称为Java PersistenceQuery Language)是一种独立于平台的面向对象的查询语言,定义为Jakarta Persistence(JPA;以前称为Java Persistence API)规范的一部分-

allway2的博客 1496

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何利用Python爬虫技术,快速抓取东方财富网的实时股票数据。通过逆向分析其JSONP数据接口,构建了包含请求处理、数据清洗、分页调度及多格式存储的完整自动化采集系统,并提供了应对反爬策略与生产部署的进阶优化思路,附有可直接运行的完整代码。

weixin_29084231的博客 875

带有HSE组件的S32系列芯片中各子系统如何依次启动?

仔细阐述了上电后各个子系统的启动顺序,并给出了详细的启动步骤流程图。

车载系统攻城狮 1702

JPA自定义返回结果集

在注解Query中可以直接new对象 @Query("select new com.mytest.vo.VideoVO(u.id,v.userId,v.audioId,v.videoDesc,v.videoPath,v.videoSeconds,v.videoWidth,v.videoHeight) from Video v,User u where v.userId = u.id") ...

Rico_Yip 1096

YOLOv8改进 | 特殊场景检测篇 | 最新的多尺度特征提取DICAM(全网独家首发,增强水下图像的质量)

本文给大家带来的最新改进机制是多尺度特征提取和通道注意力机制DICAM,深度Inception和通道注意力模块(DICAM)主要用于用于增强水下图像的质量、对比度和色偏。所提出的DICAM模型考虑了水下图像的比例退化和不均匀色偏,从而提高图像的质量。通过在两个公开的水下图像增强数据集上的广泛实验,验证了提出的模型在全参考和无参考图像质量评估指标方面。欢迎大家订阅我的专栏一起学习YOLO,购买专栏读者联系读者入群获取进阶项目文件!

Snu77的博客 2216

JPA自定义SQL查询

JPA自定义SQL查询

lml21lml的博客 3976

OpenHarmony电源管理驱动架构剖析:HDI框架下的低功耗实现

鸿蒙电源管理驱动模块是OpenHarmony操作系统中负责设备电源状态管理的核心组件。该模块基于HDI(Hardware Device Interface)框架实现,提供了完整的电源管理功能,包括系统休眠/唤醒、运行锁管理、休眠模式控制等核心功能。public:// 主要接口函数// 运行锁管理private:// 内部辅助函数// 成员变量public:// 运行锁控制接口// 回调管理private:// 内部辅助函数。

m0_67505153的博客 209

Python-增加b站视频播放量

如果条件允许的情况下,有代理API更好,每次请求url调用API也更方便。如果没有的话,也不用担心,网上本身也有着很多免费国内代理,不过代理是否可用需要自己花点时间去检测,检测方法笔者这里就不详述了,后面有时间的话会单独针对这一块做详细说明。在开始之前,需准备代理IP。总之,在每次请求url的时候,随机带入某个IP防止被平台检测,便于达到增加播放量预期。大致思路就是针对你的目标代理平台进行IP抓取,并存入到自己本地的IP代理池。本文是该专栏的第1篇,后面会持续更新对应平台干货知识,记得关注。

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 5211

springboot JPA 基本查询和Specification查询

0 背景 springboot JPA提供了查询数据的接口,使用起来简洁且强大。以下主要从基本查询和Specification查询(实现更复杂的查询)两方面展开。 1 基本查询 1.1 JpaRepository使用 只需继承JpaRepository接口,便可以使用基本的查询,具体方法可自行查看。 @Repository public i...

wangyan_z的博客 2585

第16课:动手实战中文句法依存分析

句法分析是自然语言处理(NLP)中的关键技术之一,其基本任务是确定句子的句法结构或者句子中词汇之间的依存关系。主要包括两方面的内容:一是确定语言的语法体系,即对语言中合法句子的语法结构给予形式化的定义;另一方面是句法分析技术,即根据给定的语法体系,自动推导出句子的句法结构,分析句子所包含的句法单位和这些句法单位之间的关系。 句法分析被用在很多场景中,比如搜索引擎用户日志分析和关键词识别,比如信息抽...

春华秋实 2437

jpa模糊查询_09springboot系列:jpa的高级使用2

限制查询查询取前一个实体/** * 取年龄最大 */ User findTopByOrderByAgeDesc();测试类 @Test public void testFindTopByOrderByAgeDesc(){ Assert.assertEquals(30,(int)userRepository.findTopByOrderByA...

weixin_39549899的博客 112

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jap sql 保存_SpringBoot JPA 调用SQLServer储存过程

版本信息:SpringBoot v2.1.6JPA2.2.4SQLServer 2012业务需求:按时间段连续统计每日销售额,如出现无销售情况,填充日期销售额为0思路:创建储存过程,JPA调用,Service层使用工具类转换查询到的结果集1、创建储存过程储存过程查询结果如图: 2、JpaRepository 中调用:public interface 类名 extends JpaReposito...

weixin_33274728的博客 485

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

springboot jpa 多表操作

springbootjpa多表操作 ************************************** jpa使用nativeQuery实现多表联查,多表聚合 示例:schoolstudent school:id,name student:id、name、age、school_id 多表联查:id,name,age,schoolName,自定义类Stu...

weixin_43931625的博客 1122

springboot spring data jpa的使用

转自:https://www.cnblogs.com/ityouknow/p/5891443.html 一、spring data jpa介绍 1、首先了解JPA是什么? JPA(Java Persistence API)是sun官方提出的Java持久化规范。它为java开发人员提供了一种对象/表之间关联映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合

知行合一 1855

SpringBoot集成jpa 一篇就够了 超详细

SpringBoot集成jpa 网上有很对jpa的介绍,但是都不是很全,这边根据公司的实际使用情况进行的总结。 JPA、Hibernate、Spring data jpa之间的关系 主要参考https://my.oschina.net/u/3080373/blog/1828589 大家可以读一下这篇文章 什么是JPA? 全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。 为我们提供了: 1)ORM映射元数据:JPA支持XML

cmx1060220219的博客 8万+

springboot jpa实现多条件动态查询

最近学习了springboot项目,用到了对条件动态查询,做一些必要的笔记,一来是对自己学习的知识的巩固,二来对有同样问题的人有参考作用 文章目录一 原理简介二 代码举例三 总结 一 原理简介 使用Spring Data JPA进行数据操作的时候一般有操作的复杂程度分为三个档次。 1、使用Spring Data JPA接口。 JpaRepository继承于PagingAndSortingRepository,所以它传递性地拥有了以上接口的所有方法,同时,它还继承了另外一个QueryByExampl.

ergouy's blog 1万+

SpringBoot使用JPA如何查询部分字段

用过JPA的都知道,只需要继承JpaRepository 根据Jpa的函数命名规范写出接口中的函数,不需要实现,底层就可以自动解析成各种数据库的sql语句,进行增删改查等操作。 自定义简单的查询方法: 如findByUserName,findByUserNameOrEmail(String username, String email)等条件的属性名称与个数要与参数的位置与个数一一对应,JpaRe...

静幽水 2万+

SpringBoot中JPA多表联合自定义查询@Query

SpringBoot中JPA多表联合自定义查询@Query 版权声明:本文为博主原创文章,转载请注明出处,谢谢。 其他相关文章见:个人博客站点:www.val1ant.xin SpringBoot中JPA多表联合自定义查询@Query 1. 实体类 2. 数据库操作类 1. 原生SQL查询 2. 默认的JPQL方法 3. 数据处理类 1. 实体类...

熊大的专栏 2万+

springboot jpa 返回结果自定义查询

这里自定义的实体是没有在数据映射的实体。可以返回聚合函数的值。(个人理解可以。。。。。。) 第一种方法 实体类。(这里本人使用的是idea) @Data public class NameOnlyDto implements Serializable { private String firstName; private String lastName; ...

penliyoushui的博客 2732

springboot jpa自定义查询结果封装自定义对象

使用Jpa自定义查询时,需要将查询结果自动封装对象中,有两种比较简单的方法: 方法一:返回对象为interface,只需要定义属性的get方法,jdk动态代理封装数据,执行原生sql比较方便,只需要字段和属性名一致。 数据表实体类 @Setter @Getter @Entity @ToString @DynamicUpdate @DynamicInsert @Table(name = "user") public class User implements Serializable { @Id

fanglinxing的专栏 5276

Springboot jpa使用sum()函数返回结果如何接收

1、需求 我的需求是统计域名以及域名出现的次数。 之前使用springboot jpa都是把数据库中的表跟实体类绑定,创建继承JpaRepository的接口。如下: @Repository public interface UrlsRepository extends JpaRepository<Urls, String> { Optional<Urls&...

ununie的博客 2万+

SpringBoot JPA实践之EntityManage查询返回自定义DTO

SpringBoot JPA实践之EntityManage查询返回自定义DTO 在很多时候我更喜欢随意组合查询出来返回一个DTO对象的实现,JPA提供的多数查询均以返回Entity居多,它提供的EntityManager对象可以实现将SQL语句查询的结果转换为自定义DTO对象(这与@Query注解查询返回接口结果集相似),本篇文章围绕不使用任何Entity与对象级联配置的情况,将原生SQL查询的结果集转换为自定义DTO对象。 参考代码 packagecn.chendd.example.jpa...

My_SweetXue的博客 2756
上一篇: Android 百度地图两点画弧线
下一篇: SpringBoot 发布ApplicationEventPublisher和监听ApplicationEvent事件
miskss
博客等级 码龄16年 24粉丝 62原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值