最近遇到一個需求,查詢數據庫中對應表的字段是動態的,項目使用的框架使用JPA+Spring Boot,JPA自帶原生SQL支持的傳入參數是強類型的,無法用於查詢語句的字段更改,因為插入字符串的話帶有單引號,需要另外定義原生SQL
因此我們創建一個查詢類
import com.weiqitonggame.trade.model.WebInfo; import org.springframework.stereotype.Component; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @Component //標記為組件,spring啟動時會將該類掃描進容器 public class InformationDaoEM { @PersistenceContext //注入的是實體管理器,執行持久化操作 EntityManager entityManager; public String getInfoWebWaring(String column){ String SQL = "SELECT "+column+" FROM config LIMIT 1"; Object obj = entityManager.createNativeQuery(SQL).getSingleResult(); return String.valueOf(obj); } public WebInfo getWebInfo(String [] args){ String SQL = "SELECT id, "+ args[0]+" log_url, "+ args[1]+" title, "+ args[2]+" key_word, "+ args[3]+" description, "+ args[4]+" address, "+ args[5]+" contact "+ "FROM config LIMIT 1"; WebInfo webInfo = (WebInfo) entityManager.createNativeQuery(SQL,WebInfo.class).getSingleResult(); return webInfo; } }
其中
EntityManager.createNativeQuery(SQL)返回的是Object對象
entityManager.createNativeQuery(SQL,WebInfo.class)返回的是映射后的實例對象
實體類WebInfo需要進行以下處理,確保被掃描進spring容器
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import javax.persistence.*; @Data //生成讀寫方法 @AllArgsConstructor //生成全參構造方法 @NoArgsConstructor //生成無參構造方法 @Accessors(chain = true) @Entity(name = "tableName") //標記為entity public class WebInfo { @Id @GeneratedValue(strategy= GenerationType.AUTO) @Column(name = "id") //查詢結果對應字段 private Integer id; @Column(name = "log_url") private String logUrl; @Column(name = "title") private String title; @Column(name = "key_word") private String keyWord; @Column(name = "description") private String description; @Column(name = "address") private String address; @Column(name = "contact") private String contact; }
Query.getSingleResult() 執行SQL語句,返回一個查詢結果,常用的還有以下方法
Query.getResultList() () 執行SQL語句,返回一個List集合
Query.getFirstResult() () 執行SQL語句,返回一個系列結果集合的第一個
調用方式如下:
import org.springframework.stereotype.Service; import com.weiqitonggame.trade.service.InformationService; import org.springframework.beans.factory.annotation.Autowired; import com.weiqitonggame.trade.dao.InformationDaoEM; import com.weiqitonggame.trade.model.WebInfo; @Service //標記為service public class InformationServiceImpl implements InformationService { @Autowired //注入informationDaoEM private InformationDaoEM informationDaoEM; @Override public String getWebWaring(String column) { return informationDaoEM.getInfoWebWaring(column); } @Override public WebInfo getWebInfo(String[] args) { return informationDaoEM.getWebInfo(args); } }