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

