SpringBoot中JPA使用動態SQL查詢


https://www.jianshu.com/p/f72d82e90948

 

可以重點關注方法二,把原生sql傳入數據庫去查詢

好處是:更加靈活
壞處是:拼接sql比較痛苦,也容易出問題,比如拼接的sql某些字段不存在或者拼接后語法不符合sql語句

package com.aircas.satellitemanagement.jpa;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;

@RestController
@RequestMapping(value = "/user")
public class UserController {

    @Autowired
    LocalContainerEntityManagerFactoryBean entityManagerFactory;

    @GetMapping(value = "/all/4")
    public List<User> exec() {
        EntityManager em = entityManagerFactory.getNativeEntityManagerFactory().createEntityManager();
        StringBuilder sqljoint = new StringBuilder(300);
        sqljoint.append("SELECT * FROM user");
        String sql = sqljoint.toString();
        em.getTransaction().begin();
// User是我自己定義的entity bean Query query
= em.createNativeQuery(sql, User.class); List<User> obj = query.getResultList(); return obj; } }
package com.aircas.satellitemanagement.jpa;

import lombok.Data;
import lombok.ToString;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user")
@Data
@ToString
public class User {

    @Id
    private String id;

    private String name;

    private String startTime;


}

數據庫表結構

 

查詢結果,是get接口,我就直接用瀏覽器訪問了

 

 注意:實際應用中,會比較復雜,一般來說前台會給后台傳一些參數比如name=xxx,后台需要去拼接sql語句

 

----------------------------------------------------------------------------------------------------------------------------------------------------------

在后續的使用中發現 LocalContainerEntityManagerFactoryBean 會有並發問題,然后嘗試了直接使用 EntityManager,發現可以用,目前沒啥問題,修改后的如下

package com.aircas.satellitemanagement.jpa;


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

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;

@RestController
@RequestMapping(value = "/user")
public class UserController {

@Autowired
EntityManager entityManager;

@GetMapping(value = "/all/4")
public List<User> exec() {
StringBuilder sqljoint = new StringBuilder(300);
sqljoint.append("SELECT * FROM user");
String sql = sqljoint.toString();
// User是我自己定義的entity bean
Query query = entityManager.createNativeQuery(sql, User.class);
List<User> obj = query.getResultList();
return obj;
}


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM