1. 程式人生 > >JPA自定義VO接受返回結果集(unwrap)

JPA自定義VO接受返回結果集(unwrap)

JPA跟mybitis比較,簡單的業務搜尋是方便的,但是設計到複雜的SQL搜尋時,我們需要自定義SQL。

[email protected]直接寫SQL,缺點是無法動態的組裝條件

2.JPA的Specification物件動態組裝where搜尋條件

3.entityManager執行CriteriaBuilder

4.entityManger直接使用createNativeQuery,執行原生SQL。這裡設計到返回結果集的承載體必須是資料庫對應的實體。

   這裡說一個自定義的VO承接返回結果集的方法。

ProjectAttendanceEntity
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "f_id")
    private Long fId;

    @Column(name = "user_id")
    private Integer userId;

    @Column(name = "zh_name")
    private String zhName;

    @Column(name = "po_code")
    private String poCode;

    @Column(name = "po_name")
    private String poName;

    @Column(name = "punch_date")
    private String punchDate;

    @Column(name = "is_original")
    private String isOriginal;

    @Column(name = "attendance_hours")
    private String attendanceHours;

    @Column(name = "work_hours")
    private String workHours;

    @Column(name = "punch_area")
    private String punchArea;

結果集承接VO   (AttendancePoSzVO)

    private String poId;

    private String poName;

    private String zhName;

執行介面:

/**
     * 批量修改專案名稱
     * @return
     */
    @PostMapping("/po/sz/batch/{project}/{pn}/{ps}")
    public PageResultVO findBatchPoInfoByUserIdAndDate(@RequestBody List<Long> ids,@PathVariable String project,@PathVariable Integer pn,@PathVariable Integer ps){
        log.info("url:/po/sz/batch/"+"|param:"+ids);
        //通過id查詢資料
        List<ProjectAttendanceEntity> projects = projectAttendanceEntityRepository.findByIdIn(ids);
        //獲取SQL
        String sql = getSQL(projects,pn,ps);
        Query query = entityManager.createNativeQuery(sql);
        List<AttendancePoSzVO> list = query.unwrap(NativeQuery.class).setResultTransformer(Transformers.aliasToBean(AttendancePoSzVO.class)).getResultList();
        //初始化結果集
        List<DropDownVO> result = new ArrayList<>();
        for(AttendancePoSzVO poSz : list){
            result.add(new DropDownVO(poSz.getPoName(),poSz.getPoId()));
        }
        return new PageResultVO(GlobalReturnCode.SUCCESS_CODE,"SUCCESS",ps,pn,result);
    }


    /**
     * 組裝查詢SQL
     * @return
     */
    public String getSQL(List<ProjectAttendanceEntity> poStatus, Integer pn, Integer ps){
        StringBuilder sql = new StringBuilder("SELECT DISTINCT res.po_id as poId,res.po_name as poName, GROUP_CONCAT(DISTINCT res.user_id) AS zhName ");
            sql.append(" FROM (");
            sql.append(" SELECT tt.po_name,tt.po_id,tt.user_id");
            sql.append(" FROM sie_sz_po_attendance_v tt ");
            sql.append(" WHERE");
            for(ProjectAttendanceEntity po : poStatus){
                sql.append("(tt.user_id = ").append(po.getUserId()).append(" and tt.rt_begin_date <= '").append(po.getPunchDate())
                    .append("' and tt.rt_end_date >= '").append(po.getPunchDate()).append("') OR ");
            }
            //截掉最後一個OR
            sql = new StringBuilder(sql.substring(0,sql.length()-3));
            sql.append(" ) res");
            sql.append(" GROUP BY res.po_name,res.po_id");
            sql.append(" HAVING ");
            for(ProjectAttendanceEntity po : poStatus){
                sql.append(" INSTR(zhName,").append(po.getUserId()).append(") >0").append(" AND ");
            }
            //擷取最後一個AND
            sql = new StringBuilder(sql.substring(0,sql.length()-4));
            sql.append(" LIMIT ").append(pn).append(",").append((pn+1)*ps);
        return sql.toString();
    }

核心程式碼:

List<AttendancePoSzVO> list = query.unwrap(NativeQuery.class).setResultTransformer(Transformers.aliasToBean(AttendancePoSzVO.class)).getResultList();

但是這裡的 setResultTransformer 已經過時了。

所以接下來尋找 setResultTransformer的替代API。

相關推薦

JPA定義VO接受返回結果unwrap

JPA跟mybitis比較,簡單的業務搜尋是方便的,但是設計到複雜的SQL搜尋時,我們需要自定義SQL。 [email protected]直接寫SQL,缺點是無法動態的組裝條件 2.JPA的Specification物件動態組裝where搜尋條件 3.ent

JPA定義物件接收查詢結果

最近使用JPA的時候,碰到需要自定義查詢結果集的場景,網上搜了一下,都是需要自定義方法寫一大串程式碼實現的,太繁瑣了,有那時間還不如用mybaits。用JPA就是要儘量通過宣告介面解決持久層問題,要不然鬼用。逼得沒辦法去了官網看看文件,再沒有就放棄了,沒時間看原始碼。最終找到

oracle 儲存過程返回結果 轉載

好久沒上來了, 難道今天工作時間稍有空閒, 研究了一下oracle儲存過程返回結果集.        配合oracle臨時表, 使用儲存過程來返回結果集的資料讀取方式可以解決海量資料表與其他表的連線問題. 在儲存過程中先根據過濾條件從海量資料表中選出符合條件的記錄並存放到臨

定義統一api返回json格式app後臺框架搭建三

pub ble ace proc 2.3 resp think err ons 在統一json自定義格式的方式有多種:1,[email protected]/* */,2,自定義一個註解,自己去解析對象成為json字符串進行返回 第一種方式,我就不推薦,想弄得的

JAVA呼叫儲存過程--返回結果傳入基本型別引數,返回基本型別和結果

1  建立儲存過程 create or replace procedure examplepro( inparm1 in varchar2,inparm2 in number,outparm1 out number,result out type_cursor)  ...

日本程序開發式定義的malloc/free函數-源代碼ソースコード

size span 鏈表 pan ppp 附近 efi ret system 這篇文章終於是貼出了我們的源代碼,實現每個功能也是花費了許多時間,大家在編寫的時候可以多花點時間,多嘗試,多看就能寫出來。 老師的要求不能在程序裏面使用malloc,new什麽的,有要求使用鏈表,

ci框架定義數據庫查詢名稱方法

cti 子目錄 ons pos 傳遞 sele 傳遞參數 ren 基礎 適合剛接觸PHP和ci框架的人,本人也是小白 原因:官方給的數據庫查詢方法可能不利於記憶使用,官方給的一些方法只能進行基礎查詢,每次復合查詢都需要拼接條件,自己定義定義方法直接調用方法即可 操作步驟:

Android定義View--翻書控制元件

0.前言 最近重看了一遍封神演義,感覺QQ閱讀那個翻書的效果挺好的,準備做一個。上週五下午用了兩個小時只寫了一部分功能,以後有時間再完善 1.分析 先看效果圖 這個空間,說簡單也簡單,說難也難,簡單就在於這個效果主要就是依賴canvas的clippath才見到部分canvas,難就難在裁

總想自己動動手系列·1·本地和外網Liunx伺服器上部署的web專案按照定義的報文格式進行互動

一、準備工作 (1)有一臺屬於自己的雲伺服器,併成功部署和釋出一個web專案(當然,本質上來說Java-Project也沒問題),通過外網IP可以正常訪問該web專案。   需要說明的是:任何web專案,只要成功部署後在外網上能訪問到即可。本案例注重修改web對請求的監聽和過濾的處

定義帶刻度的進度條seekbar

效果: layout佈局,(“-”,“+”和seekbar佈局) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com

定義控制元件三部曲檢視篇——RecyclerView系列之一簡單使用

絕望的時候不要那麼絕望,高興的時候不要那麼高興,是你慢慢會學會的。 ——董卿 轉了一年多,又回來繼續做Android。果然還是看到程式碼最讓我興奮……但有些事,沒經歷過,總歸還是遺憾的。在VIVO的遊戲中心,有一個特別炫酷的功能: 這個功能就是使

百度UEditor定義上傳檔案儲存路徑補充

上一篇百度UEditor自定義上傳檔案儲存路徑發表後,再解決了線上管理、線上圖片和線上附件功能不能使用的問題。 需要修改FileManager類: 註釋掉的程式碼是原來jar包的程式碼,不再需要,可以刪除掉。 //private String di

HTML5呼叫照相機並定義顯示獲取到的圖片FileReader

越來越多的移動端網頁流行,在手機上拍攝照片或者從相簿中選取照片並上傳的功能不可或缺。本文以例項說明上述功能如何實現,並介紹FileReader物件。 1. 需求 如下圖,點選有加號的框,拍攝或者從相簿中選擇照片後,將圖片顯示在框中。 2. 程式

定義控制元件三部曲檢視篇——瀑布流容器WaterFallLayout實現

前言:只要在前行,夢想就不再遙遠 系列文章: 前面兩節講解了有關ViewGroup的onMeasure、onLayout的知識,這節我們深入性地探討一下,如何實現經常見到的瀑布流容器,本節將實現的效果圖如下: 從效果圖中可以看出這裡要完成的

C#定義控制元件程式設計輕鬆入門1

前 言 話說,許多新手在接觸C#的時候都覺得C#使用起來特別容易方便,相對C++來說沒有那麼多的繁瑣,比如C++每次在使用一個函式,都要先在標頭檔案中宣告一遍,而C#宣告和實現都在一起,立馬可以用。而且不會一會要寫指標一會兒要寫引用,如果是遇到VC那些控制代碼就把頭給搞大。 隨著

定義控制元件三部曲檢視篇——RecyclerView系列之二ItemDecoration

從來不跌倒不算光彩,每次跌倒後能再站起來,才是最大的榮耀。 一、新增分割線 1.1 引入ItemDecoration 在上一篇中,我們講解了RecyclerView的基本使用方法,但有個問題:為什麼Item之間沒有分割線呢?其實,給RecyclerView新

定義檢視---圓角柱狀圖

一、寫在前文 之前寫過一篇部落格 – 巧妙使用WilliamChart繪製出只有兩個圓角的柱狀圖,當時是專案需要,所以用了第三方的庫去實現只有頂部帶兩個圓角的柱狀圖。雖然最終是實現了效果,但是第三方的圖表自定義不夠,例如控制柱狀圖的間距,高度等等。所以,最終決

YII的定義路由規則類的使用初級

發現網上的yii自定義路由規則類的使用介紹比較少 前兩天做了網站SEO方面的URL優化工作。 具體要求是:商城門店的URL中需要有門店的地區id和分頁p出現, 如:http://www.abc.com/store-provinceid(門店地區id)-p(分頁數).

定義控制元件之繪圖篇:canvas變換與操作

前言:前幾篇講解了有關canvas繪圖的一些操作,今天更深入一些,講講對畫布的操作,這篇文章不像前幾篇那麼容易理解,如果以前沒有接觸過畫布的童鞋可能比較難以理解,為什麼會這樣。我儘量多畫圖,讓大家更清晰明白。前幾天偶然看到一篇文章,寫的樸實無華,充滿正能量,我非常喜歡裡面的一

可滾動、可更新的結果

14.6  批處理 批處理也是一個為了減輕開發員負擔的設計,它不再需要開發員一次次進行類似的工作。它讓所有相類似的工作一起幹完,逐個處理的工作由後臺來完成。 14.6.1  批處理規範 JDBC升級到2.0後增強了Statement介面,使它能夠以批處理方式執行更新操作。