如何使用SpEL表達(dá)式實現(xiàn)動態(tài)分表查詢
這篇文章主要介紹了如何使用SpEL表達(dá)式實現(xiàn)動態(tài)分表查詢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
這里的動態(tài)分表查詢并不是動態(tài)構(gòu)造sql語句,而是利用SpEL操作同一結(jié)構(gòu)的不同張表。
也可以參考Spring Data Jpa中的章節(jié)http://docs.spring.io/spring-data/jpa/docs/1.11.3.RELEASE/reference/html/#jpa.query.spel-expressions
背景如下:
因為數(shù)據(jù)量較大,將數(shù)據(jù)按年份進(jìn)行了分表,表結(jié)構(gòu)都是一致的。例如現(xiàn)在有兩張表分別表示2017/2018年數(shù)據(jù)
表中只有id和name兩個字段
DROP TABLE IF EXISTS "public"."data_2017"; CREATE TABLE "public"."data_2017" ( "id" int4 NOT NULL, "name" varchar(255) COLLATE "default" ) WITH (OIDS=FALSE)
實際工作中們需要根據(jù)請求去選擇查詢17年的表還是18年的表。執(zhí)行的sql語句除了表名不一致,其他均一致。
SELECT id,name FROM table
利用JPA實現(xiàn)
因為JPA中實體與表示一一對應(yīng)的,而實際查詢的語句又是一樣的,那么如果按照傳統(tǒng)JPA方法,就需要建立N個Entity,N個Repository,N個查詢方法。
現(xiàn)在使用SpELl表達(dá)式可以簡化Entity及Repository中的代碼編寫,相對提高效率。
1、建立一個抽象實體
/**
* Created by dingshuo on 2017/6/5.
*/
@MappedSuperclass
public class AbstractMappedType {
private int id;
private String name;
@Id
@Column(name = "id")
@JsonIgnore
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、建立17/18年表對應(yīng)的實體,繼承抽象實體
/**
* Created by dingshuo on 2017/6/5.
*/
@Entity
@Table(name = "DATA_2017", schema = "public", catalog = "powermanager")
public class Data2017 extends AbstractMappedType {
}
/**
* Created by dingshuo on 2017/6/5.
*/
@Entity
@Table(name = "DATA_2018", schema = "public", catalog = "powermanager")
public class Data2018 extends AbstractMappedType {
}
3、建立抽象Repository
/**
* Created by dingshuo on 2017/6/5.
*/
@NoRepositoryBean
public interface MappedTypeRepository<T extends AbstractMappedType>
extends Repository<T, Long> {
@Query("select t from #{#entityName} t where t.id = ?1")
List<T> findById(int id);
@Query("select t from #{#entityName} t ")
List<T> findALL();
}
4、建立17年實體的Repository,繼承抽象Repository
/**
* Created by dingshuo on 2017/6/5.
*/
public interface Data2017Repository extends MappedTypeRepository<Data2017>{
}
5、測試
@RestController
public class TestController {
@Autowired
Data2017Repository repository;
@GetMapping(value = "/test")
public String test(){
List<Data2017> object=repository.findById(1);
List<Data2017> objec1t=repository.findALL();
return "OK";
}
}
如上就可以相對簡化的使用JPA查詢結(jié)構(gòu)相同,表名不同的系列表數(shù)據(jù)了。
當(dāng)然,還是得建立N個Entity和N個Repository,還是比較麻煩的。。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring實戰(zhàn)之SpEl語法實例詳解
- Spring實戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作示例
- Spring組件開發(fā)模式支持SPEL表達(dá)式
- Spring spel表達(dá)式使用方法示例
- Spring實戰(zhàn)之使用Expression接口進(jìn)行表達(dá)式求值操作示例
- 使用Spring安全表達(dá)式控制系統(tǒng)功能訪問權(quán)限問題
- springtask 的使用方法和 cron 表達(dá)式解析
- SpringMVC請求的路徑變量里面寫正則表達(dá)式的方法
- springboot Quartz動態(tài)修改cron表達(dá)式的方法
- Spring表達(dá)式語言SpEL用法詳解
相關(guān)文章
java父子線程之間實現(xiàn)共享傳遞數(shù)據(jù)
本文介紹了Java中父子線程間共享傳遞數(shù)據(jù)的幾種方法,包括ThreadLocal變量、并發(fā)集合和內(nèi)存隊列或消息隊列,并提醒注意并發(fā)安全問題2025-02-02
Struts2中圖片以base64方式上傳至數(shù)據(jù)庫
這篇文章主要介紹了Struts2中圖片以base64方式上傳至數(shù)據(jù)庫的實現(xiàn)代碼,代碼分為前臺和后臺兩段,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09
Java數(shù)據(jù)結(jié)構(gòu)之雙向鏈表圖解
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)之雙向鏈表,文中圖解分析的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05
SpringBoot3整合pageHelper實現(xiàn)分頁功能
PageHelper是一個開源的Java分頁插件,它提供了方便的分頁查詢功能,適用于大多數(shù)基于Java的持久層框架(如MyBatis、Hibernate等),本文給大家介紹了springboot3整合pageHelper實現(xiàn)分頁功能的方法,需要的朋友可以參考下2024-08-08
如何在Java中創(chuàng)建線程通信的四種方式你知道嗎
開發(fā)中不免會遇到需要所有子線程執(zhí)行完畢通知主線程處理某些邏輯的場景?;蛘呤蔷€程 A 在執(zhí)行到某個條件通知線程 B 執(zhí)行某個操作。下面我們來一起學(xué)習(xí)如何解決吧2021-09-09
解決Springboot啟動報錯:類文件具有錯誤的版本61.0,應(yīng)為?52.0
這篇文章主要給大家介紹了關(guān)于解決Springboot啟動報錯:類文件具有錯誤的版本?61.0,應(yīng)為?52.0的相關(guān)資料,這是查閱了網(wǎng)上的很多資料才解決的,分享給大家,需要的朋友可以參考下2023-01-01

