我的编程空间,编程开发者的网络收藏夹
学习永远不晚

springboot jpa之返回表中部分字段如何处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

springboot jpa之返回表中部分字段如何处理

这篇文章主要介绍springboot jpa之返回表中部分字段如何处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

springboot jpa返回表中部分字段

使用springboot jpa操作数据库可以加快我们的开发效率,对于简单的crud操作来说,使用jpa来开发不要太爽,但是说实话对于一些复杂的数据库操做jpa使用起来就不是这么爽了。

在开发中很多时候我们要返回的可能只是数据库表中或某个类中的一部分字段,这个要是用mybatis的话就很简单,直接在sql中select字段就好了,规范一点就数据传输类接一下,偷个懒的话直接用map接就完事了。但就是这么个小操作在jpa中就不能这么直接。

废话一大堆(⊙_⊙)下面是我在jpa中处理返回部分字段的方法。

public interface RoomOrderTimeRepository extends JpaRepository<RoomOrderTime,Integer>{     @Query("select  new com.ddzrh.dto.RoomOrderTimeOutPut(r.orderTime,COUNT(r.orderTime) )" +            " from RoomOrderTime as r " +            " where r.roomTypeId =:roomId"+            " GROUP BY r.orderTime" )    List<RoomOrderTimeOutPut> queryRoomOrderTime(@Param("roomId") Integer roomId);  }

看完上面的代码相比大家也能猜到,是的没什么好方法,我将要返回的数据都封装到了RoomOrderTimeOutPut类中。

@Datapublic class RoomOrderTimeOutPut {     private Date orderTime;    private Long orderNum;     public RoomOrderTimeOutPut(Date orderTime, Long orderNum) {        this.orderTime = orderTime;        this.orderNum = orderNum;    }    }

像上面的代码,我希望查询返回某个时间某间房的预定数,我就将希望返回的预定时间和预定数封装至RoomOrderTimeOutPut并写以这两个字段为入参的构造函数,这个构造函数一定要写。看Query中的sql 有一个new RoomOrderTimeOutPut 的操作,这里就调用了构造函数,根据构造函数的入参将数据库查出的值传入。

JPA 自定义返回字段

实体类:User.java

@Data@Accessors(chain = true)@EqualsAndHashCode(callSuper = true)@Entity@Table(name = "user")public class User extends AbstractEntity {     @Column(unique = true)    private String username;     private String password;     private String nickname;     private String email;     @Column(name = "org_id")    private Long orgId;     @Column(name = "org_name")    private String orgName;}

DTO类:UserDTO.java

import lombok.Value; @Valuepublic class UserDTO {     private String username;     private String nickname;     private String email;}

repository类:UserRepository.java

public interface UserRepository extends JpaRepository<User, Long> {         Optional<User> findByUsername(String username);          <T> Optional<T> findByUsername(String username, Class<T> type);}

测试:

@RunWith(SpringRunner.class)@SpringBootTestpublic class UoServerApplicationTests {     @Autowired    UserRepository userRepository;     @Test    public void contextLoads() {        UserDTO userDTO = userRepository.findByUsername("wuqilong", UserDTO.class).get();        Console.log(userDTO);    }}

注意:返回的DTO中属性名称需要和实体类中字段名一致,且加上lombok包中的@Value注解,这种方式对于只需要返回表中部分的字段很方便,如果需要自定义返回字段名称,可以参考以下方法:

需求:统计注册人数

定义一个返回对象

使用@Query(value = "select new com.wd.cloud.uoserver.dto.TjVO(u.orgId ,count(u.orgId)) from User u group by orgId")进行查询。

@Valuepublic class TjVO {     Long orgId;     Long registerCount;}    @Query(value = "select new com.wd.cloud.uoserver.dto.TjVO(u.orgId ,count(u.orgId)) from User u group by orgId")    Page<TjVO> tjByOrgId(Pageable pageable);

或者也可以用下面的方法:

定义一个接口,用getXxx定义返回字段。xxx需要和返回字段的别名一致。

如果不一致,可以使用org.springframework.beans.factory.annotation包中的@Value进行映射

public interface TjDTO {         Long getOrgId();        String getRegisterDate();         String getRegisterCount();         @Value("#{target.adminCount}")    Long getManagerCount(); }

repository类:UserRepository.java添加方法tjByOrgId(),返回orgId和registerCount

     @Query(value = "select DATE_FORMAT(gmt_create,\"%Y-%m-%d\") as registerDate,count(*) as registerCount from user group by registerDate",nativeQuery = true)    List<TjDTO> tj();         @Query(value = "select org_id as orgId,count(*) as registerCount from user group by orgId",            countQuery = "select count(*) from user group by org_id", nativeQuery = true)    Page<TjDTO> tjByOrgId(Pageable pageable);

测试:

@RunWith(SpringRunner.class)@SpringBootTestpublic class UoServerApplicationTests {     @Autowired    UserRepository userRepository;     @Test    public void contextLoads() {        List<TjDTO> tjDTOList = userRepository.tj();        tjDTOList.forEach(tjDTO -> {            Console.log("registerDate={},registerCount={}", tjDTO.getRegisterDate(), tjDTO.getRegisterCount());        });    }}

结果日志:

Hibernate: select DATE_FORMAT(gmt_create,"%Y-%m-%d") as registerDate,count(*) >as registerCount from user group by registerDate
registerDate=2019-01-28,registerCount=7393
registerDate=2019-03-07,registerCount=1

需求:根据机构分组,统计机构总人数和用户类型为2的人数

@Componentpublic class SpecBuilder {     @PersistenceContext    private EntityManager entityManager;     public List<Object[]> tj(Long orgId) {        CriteriaBuilder cb = entityManager.getCriteriaBuilder();        CriteriaQuery<Object[]> query = cb.createQuery(Object[].class);        Root<User> root = query.from(User.class);        //拼接where条件        List<Predicate> predicateList = new ArrayList<Predicate>();        if (orgId != null) {            predicateList.add(cb.equal(root.get("orgId"), orgId));        }        //加上where条件        query.where(ArrayUtil.toArray(predicateList, Predicate.class));        query.multiselect(root.get("orgId"),                cb.count(root),                cb.sum(cb.<Integer>selectCase().when(cb.equal(root.get("userType"), 2), 1).otherwise(0)));        query.groupBy(root.get("orgId"));        //最终sql:  select org_id,count(id),sum(case when user_type=2 then 1 else 0 end) from user where org_id=?1 group by org_id;        TypedQuery<Object[]> typedQuery = entityManager.createQuery(query);        return typedQuery.getResultList();    } }

测试:

@RunWith(SpringRunner.class)@SpringBootTestpublic class UoServerApplicationTests {     @Autowired    SpecBuilder specBuilder;     @Test    public void contextLoads() {        List<Object[]> tjDTOList1 = specBuilder.tj(169L);        tjDTOList1.forEach(tjDTO -> {            Console.log("orgId={},总人数={},管理员人数={}", tjDTO[0], tjDTO[1], tjDTO[2]);        });    }}

springboot jpa之返回表中部分字段如何处理

以上是“springboot jpa之返回表中部分字段如何处理”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

springboot jpa之返回表中部分字段如何处理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

springboot jpa之返回表中部分字段如何处理

这篇文章主要介绍springboot jpa之返回表中部分字段如何处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!springboot jpa返回表中部分字段使用springboot jpa操作数据库可以加快我们的
2023-06-22

如何只返回实体类中的部分字段问题

这篇文章主要介绍了如何只返回实体类中的部分字段问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-20

java只返回实体类中的部分字段问题如何解决

这篇文章主要介绍了只返回实体类中的部分字段问题如何解决,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。如何只返回实体类中的部分字段在实体类上添加注解@JsonInclude(JsonInclude.Include.NON_
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录