首页 > 作文

springboot jpa之返回表中部分字段的处理详解

更新时间:2023-04-04 01:18:07 阅读: 评论:0

目录
springboot jpa返回表中部分字段jpa 自定义返回字段

springboot jpa返回表中部分字段

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

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

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

/** * 房间已经预定的时间统计表 */public interface roomordertimerepository extends jparepository<roomordertime,integer>{     @query("lect  new com.ddzrh.dto.roomordertimeoutput(r.ordertime,count(r.ordertime) )" +            " from roomordertime as r " +            " where r.roomtypeid =:roomid"+  contacts          " 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 自定义返回字段

实体类:ur.java

@data@accessors(chain = true)@equalsandhashcode(callsuper = true)@entity@table(name = "ur")public class ur extends abstractentity {     @column(unique = true)    private string urname;     private string password;     private string nickname;     private string email;     @column(name = "org_id")    private long orgid;     @column(name = "org_name")    private string orgname;}

dto类:urdto.java

import lombok.value; /** * @author wu qilong * @date 2019/4/11 * @description: 自定义返回值,字段名称要和ur实体类中的一致,加上lombok.@value注解。 */@valuepublic class urdto {     private string urname;     private string nickname;     private string email;}

repository类:urrepository.java

/** * @author wu qilong * @date 2019/4/11 * @description: */public interface urr做生意的窍门epository extends jparepository<ur, long> {     /**     * 用户名查询     *     * @param urname     * @return     */    optional<ur> findbyurname(string urname);      /**     * 用户名查询     * @param urname     * @return     */    <t> optional<t> findbyurname(string urname, class<t> type);}

测试:

@runwith(springrunner.class)@springboottestpublic class uorverapplicationtests {     @autowired    urrepository urrepository;     @test    public void contextloads() {        urdto urdto = urrepository.findbyurname("wuqilong", urdto.class).get();        console.log(urdto);    }}

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

需求:统计注册人数

定义一个返回对象

使用@query(value = “lect new com.wd.cloud.uorver.dto.tjvo(u.orgid ,count(u.orgid)) from ur u group by orgid”)进行查询。

@valuepublic class tjvo {     long orgid;     long registercount;}/**     * 按机构统计注册人数     * @param pageable     * @return     */    @query(value = "lect new com.wd.cloud.uorver.dto.tjvo(u.orgid ,count(u.orgid)) from ur u group by orgid")    page<tjvo> tjbyorgid(pageable pageable);

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

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

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

public interface tjdto {     /**     * 所属机构     * @return     */    long getorgid();    /**     * 注册时间     * @return     */    string getregisterdate();     /**     * 注册数量     * @return     */    string getregistercount();     /**     * 管理员数量 当别名与该getxxx名称不一致时,可以使用该注解调整     * @return     */    @value("#{985有哪些target.admincount}")    long getmanagercount(); }

repository类:urrepository.java添加方法tjbyorgi锲而不舍造句d(),返回orgid和registercount

 /**     * 按天统计注册人数     * @return     */    @query(value = "lect date_format(gmt_create,\"%y-%m-%d\") as registerdate,count(*) as registercount from ur group by registerdate",nativequery = true)    list<tjdto> tj();     /**     * 按机构统计注册人数     * @param pageable  分页     * @return     */    @query(value = "lect org_id as orgid,count(*) as registercount from ur group by orgid",            countquery = "lect count(*) from ur group by org_id", nativequery = true)    page<tjdto> tjbyorgid(pageable pageable);

测试:

@runwith(springrunner.class)@springboottestpublic class uorverapplicationtests {     @autowired    urrepository urrepository;     @test    public void contextloads() {        list<tjdto> tjdtolist = urrepository.tj();        tjdtolist.foreach(tjdto -> {            console.log("registerdate={},registercount={}", tjdto.getregisterdate(), tjdto.getregistercount()); 茶亦有道       });    }}

结果日志:

hibernate: lect date_format(gmt_create,”%y-%m-%d”) as registerdate,count(*) >as registercount from ur 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<ur> root = query.from(ur.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.multilect(root.get("orgid"),                cb.count(root),                cb.sum(cb.<integer>lectca().when(cb.equal(root.get("urtype"), 2), 1).otherwi(0)));        query.groupby(root.get("orgid"));        //最终sql:  lect org_id,count(id),sum(ca when ur_type=2 then 1 el 0 end) from ur where org_id=?1 group by org_id;        typedquery<object[]> typedquery = entitymanager.createquery(query);        return typedquery.getresultlist();    } }

测试:

@runwith(springrunner.class)@springboottestpublic class uorverapplicationtests {     @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]);        });    }}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。

本文发布于:2023-04-04 01:18:05,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/c3ffb208749e2d5f59bf9747dafc036f.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:springboot jpa之返回表中部分字段的处理详解.doc

本文 PDF 下载地址:springboot jpa之返回表中部分字段的处理详解.pdf

标签:字段   自定义   人数   机构
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图