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;
}
}