基於Spring Boot,使用JPA動態調用Sql查詢數據

来源:http://www.cnblogs.com/kongxianghai/archive/2017/09/22/7575988.html
-Advertisement-
Play Games

在《基於Spring Boot,使用JPA操作Sql Server資料庫完成CRUD》,《基於Spring Boot,使用JPA調用Sql Server資料庫的存儲過程並返回記錄集合》完成了CRUD,調用存儲過程查詢數據。 很多複雜的情況下,會存在要直接執行SQL來獲取數據。 通過“EntityMa ...


《基於Spring Boot,使用JPA操作Sql Server資料庫完成CRUD》《基於Spring Boot,使用JPA調用Sql Server資料庫的存儲過程並返回記錄集合》完成了CRUD,調用存儲過程查詢數據。

很多複雜的情況下,會存在要直接執行SQL來獲取數據。

通過“EntityManager”創建NativeQuery方法來執行動態SQL。

 

1.查詢結果集映射

在包“com.kxh.example.demo.domain”下的“Contact”實體上編寫命名的結果集映射,因為可以寫很多映射。

@SqlResultSetMapping註解即為映射。

name參數,可以為結果集映射取個名字。

entities參數,用來說明把Entity和查詢的結果欄位進行關聯說明。

package com.kxh.example.demo.domain;

import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FieldResult;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedStoredProcedureQueries;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.StoredProcedureParameter;

@Entity
@SqlResultSetMapping(
        name = "conatctMapping", 
        entities = @EntityResult(
            entityClass = Contact.class, 
            fields = {
                @FieldResult(name = "name", column = "name"),
                @FieldResult(name = "phone", column = "phone"),
                @FieldResult(name = "mail", column = "mail")})
)
@NamedStoredProcedureQueries({
    @NamedStoredProcedureQuery(
            name = "getContactsLikeName", 
            procedureName = "proc_get_contacts_like_name", 
            resultClasses = { Contact.class },
            parameters = {
                    @StoredProcedureParameter(
                            mode = ParameterMode.IN, 
                            name = "name", 
                            type = String.class)
            }
        )
})
public class Contact {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    private String name;
    
    private String phone;
    
    private String mail;
    
    public Contact() {
        super();
    }
    
    public Contact(String name, String phone, String mail) {
        super();
        
        this.name = name;
        this.phone = phone;
        this.mail = mail;
    }
    
    public long getId() {
        return this.id;
    }
    
    public void setId(long value) {
        this.id = value;
    }
    
    public String getName() {
        return this.name;
    }
    
    public void setName(String value) {
        this.name = value;
    }
    
    public String getPhone() {
        return phone;
    }
    
    public void setPhone(String value) {
        this.phone = value;
    }
    
    public String getMail() {
        return this.mail;
    }
    
    public void setMail(String value) {
        this.mail = value;
    }
}

 

3.通過業務對象調用

在包“com.kxh.example.demo.service”下的類“ContactsService”中添加執行函數。

通過"EntityManager"創建NativeQuery函數,第一參數是Sql,第二個參數就是上面定義的結果集映射名。

然後傳入查詢條件參數,設置最大返回結果記錄數,獲取查詢結果集。

package com.kxh.example.demo.service;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.StoredProcedureQuery;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.kxh.example.demo.domain.Contact;

@Component
public class ContactsService {
    @Autowired
    private EntityManager entityManager;
    
    @SuppressWarnings("unchecked")
    public List<Contact> findAllViaProc(String name) {
       StoredProcedureQuery storedProcedureQuery = this.entityManager.createNamedStoredProcedureQuery("getContactsLikeName");
       storedProcedureQuery.setParameter("name", name);
       storedProcedureQuery.execute();
       return storedProcedureQuery.getResultList();
    }
    
    @SuppressWarnings("unchecked")
    public List<Contact> findAllByViaQuery(String name) {
        List<Contact> contacts = this.entityManager
                .createNativeQuery("select name, phone, mail from contact where name like :name", "conatctMapping")
                .setParameter("name", name)
                .setMaxResults(5)
                .getResultList();
        
        return contacts;
    }
}

 

4.通過RestController向外提供服務

增加一個新的訪問路徑映射,在處理方法中調用contactsService.findAllByViaQuery(nameWhere)獲取查詢結果集。

package com.kxh.example.demo.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.kxh.example.demo.dao.ContactsRepository;
import com.kxh.example.demo.domain.Contact;
import com.kxh.example.demo.service.ContactsService;

@RestController
@RequestMapping("/contacts")
public class ContactsController {
    
    @Autowired
    ContactsService contactsService;//省略
//通過動態sql查
    @RequestMapping(value="/query/viadnq/likename", method=RequestMethod.GET)
    public List<Contact> findContactsUseDyanamicQueryLikeName(String name) {
        System.out.println("kxh1");
        String nameWhere = org.apache.commons.lang.StringUtils.join(new String[]{"%", name, "%"}, "");
        List<Contact> contacts = contactsService.findAllByViaQuery(nameWhere);
        if(contacts == null) {
            System.out.println("kxh4");
            return new ArrayList<Contact>();
        } else {
            System.out.println("kxh5");
            return contacts;
        }
    }
}

 

代碼

 

End 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Dima and Magic Guitar CodeForces - 366E 題意: http://blog.csdn.net/u011026968/article/details/38716425http://vawait.com/2013/11/codeforces-366e/http://w ...
  • 如圖: 在列印等腰三角形基礎之上列印鏤空等腰三角形 列印等腰三角形在此不做贅述,博客地址: http://www.cnblogs.com/realjanushu/p/7576556.html 列印等腰三角形源碼: 在此基礎上觀察 如圖: 鏤空的三角形: 特點頂層與最底層不會鏤空,除了頂層與最底層其他 ...
  • <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8 ...
  • 轉載請註明原創出處,謝謝! 經過 4 次跳票,歷經曲折的 Java 9 正式版終於發佈了!今天看著到處都是jdk9發佈了,新特性說明,心想這麼好的蹭熱度計劃能錯過嘛,哈哈,所以就發了這篇文章。 目前jdk9和jvm9的規範都還沒有出來,很多細節估計還不清楚,基本就是通過官方介紹,看的。 所以各位看官 ...
  • 如圖: 第一步:分析行數 4行 迴圈列印4層 第二步:分析 * 的個數 1->3->5->7 2*n-1 第三步:彙總列印直角三角形 第四步: 觀察 (2*n-2)/2 3->2->1 列印0的直角倒三角 第五步:彙總列印等腰三角形 最後將0替換成" "(空格),編譯再運行就好了 ...
  • 使用python web做Restful 風格,很簡單,採用Flask框架輕鬆實現一個RESTful的服務。 Restful相關介紹請查看:https://www.ibm.com/developerworks/library/ws-restful/index.html 1. 環境搭建 首先需要準備環 ...
  • JdbcUtils工具類3.0最終版,添加了事務相關功能和釋放鏈接。最終版本可以直接打成jar包,在後面的基本項目都會使用該工具類 1. JdbcUtils代碼 2. 在src下給出c3p0-config.xml配置文件 3. 總結 從第一個基本版本1.0到加入連接池2.0再到現在的事務,一步一個腳 ...
  • 算術異常類:ArithmeticExecption 空指針異常類:NullPointerException 類型強制轉換異常:ClassCastException 數組負下標異常:NegativeArrayException 數組下標越界異常:ArrayIndexOutOfBoundsExcepti ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...