SpringData JPA 使用自定義查詢(xún)(不確定表名稱(chēng)情況)

在使用SpringData JPA組件時(shí),我們一般都是定義實(shí)體厘线,定義倉(cāng)庫(kù)接口磷箕,然后就可以增刪改查了朝群。

但是在實(shí)際業(yè)務(wù)中胯甩,很多數(shù)據(jù)表的名稱(chēng)并不是固定的往产,比如我們的軌跡表呵萨,就是每天一張溺蕉,類(lèi)似:track_20210601伶丐。

這時(shí)如果在實(shí)體的@Table注解中再寫(xiě)明數(shù)據(jù)表名稱(chēng)就不現(xiàn)實(shí),需要一個(gè)途徑去處理此類(lèi)問(wèn)題疯特,因?yàn)槲覀兊臉I(yè)務(wù)涉及這種情況的表就兩個(gè)哗魂,所以這里記錄一種實(shí)現(xiàn)這個(gè)業(yè)務(wù)的簡(jiǎn)單方法。
具體如以下代碼所示:

package com.jns.jpanamingstrategy;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.Transactional;
import java.util.List;

@SpringBootTest
class JpaNamingStrategyApplicationTests {

    @PersistenceContext
    private EntityManager entityManager;

    // SQL模板
    String insertRecordTmp = "insert into %s(`id`,`name`)values(%d, '%s')";
    String selectRecordTmp = "select `id`,`name` from %s";
    String updateRecordTmp = "update %s set `name`='%s' where `id`=%d";
    String deleteRecordTmp = "delete from %s where `id`=%d";
    String findTableTmp = "select count(TABLE_NAME) from information_schema.`TABLES` where TABLE_SCHEMA='%s' AND TABLE_NAME='%s'";

    @Test
    // 啟用事務(wù)  這個(gè)注解必須加
    @Transactional
    void contextLoads() {
        // 數(shù)據(jù)表名稱(chēng)
        String tableName = "student_01";

        // 判斷數(shù)據(jù)表是否存在
        if (!findSameNameTable("test", tableName)) {
            create(tableName);

            insert(tableName, 1, "kaven");
            insert(tableName, 2, "john");
            insert(tableName, 3, "lily");
        } else {
            System.out.println(tableName + " 已經(jīng)存在漓雅!");
        }

        System.out.println("驗(yàn)證插入");
        select(tableName);

        update(tableName, 1, "han mei mei");

        System.out.println("驗(yàn)證更新");
        select(tableName);

        delete(tableName, 3);

        System.out.println("驗(yàn)證刪除");
        select(tableName);
    }

    public void create(String tableName) {
        String createTable = "create table " + tableName + "(`id` int primary key , `name` varchar(50))";
        Query query = entityManager.createNativeQuery(createTable);
        query.executeUpdate();
    }

    public void insert(String tableName, int id, String name) {
        String sql = String.format(insertRecordTmp, tableName, id, name);
        Query query = entityManager.createNativeQuery(sql);
        query.executeUpdate();
    }

    public void select(String tableName) {
        String sql = String.format(selectRecordTmp, tableName);
        Query query = entityManager.createNativeQuery(sql);
        // Object[] 為每一條數(shù)據(jù)每列的值录别,順序?yàn)閿?shù)據(jù)表列順序,索引0開(kāi)始
        List<Object[]> l = query.getResultList();
        for (Object[] o : l) {
            System.out.println(o[0] + "  " + o[1]);
        }
    }

    public void update(String tableName, int id, String name) {
        String sql = String.format(updateRecordTmp, tableName, name, id);
        Query query = entityManager.createNativeQuery(sql);
        query.executeUpdate();
    }

    public void delete(String tableName, int id) {
        String sql = String.format(deleteRecordTmp, tableName, id);
        Query query = entityManager.createNativeQuery(sql);
        query.executeUpdate();
    }


    public boolean findSameNameTable(String TABLE_SCHEMA, String TABLE_NAME) {
        boolean same = false;
        String sql = String.format(findTableTmp, TABLE_SCHEMA, TABLE_NAME);
        Query query = entityManager.createNativeQuery(sql);
        List<Object> l = query.getResultList();
        if (Integer.parseInt(String.valueOf(l.get(0))) > 0) {
            same = true;
        }

        return same;
    }

}

有一個(gè)地方需要注意邻吞,就是查詢(xún)的時(shí)候组题,關(guān)于字段的返回,具體說(shuō)明如下:


1625807923(1).png

就是當(dāng)查詢(xún)語(yǔ)句只有一個(gè)字段時(shí)抱冷,就直接返回該字段的值了崔列,不會(huì)再是Object[]數(shù)組了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旺遮,一起剝皮案震驚了整個(gè)濱河市赵讯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耿眉,老刑警劉巖边翼,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸣剪,居然都是意外死亡组底,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)西傀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)斤寇,“玉大人,你說(shuō)我怎么就攤上這事拥褂∧锼” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵饺鹃,是天一觀(guān)的道長(zhǎng)莫秆。 經(jīng)常有香客問(wèn)我间雀,道長(zhǎng),這世上最難降的妖魔是什么镊屎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任惹挟,我火速辦了婚禮,結(jié)果婚禮上缝驳,老公的妹妹穿的比我還像新娘连锯。我一直安慰自己,他們只是感情好用狱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布运怖。 她就那樣靜靜地躺著,像睡著了一般夏伊。 火紅的嫁衣襯著肌膚如雪摇展。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天溺忧,我揣著相機(jī)與錄音咏连,去河邊找鬼。 笑死鲁森,一個(gè)胖子當(dāng)著我的面吹牛祟滴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刀森,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼踱启,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了研底?” 一聲冷哼從身側(cè)響起埠偿,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榜晦,沒(méi)想到半個(gè)月后冠蒋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乾胶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年抖剿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片识窿。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斩郎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喻频,到底是詐尸還是另有隱情缩宜,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站锻煌,受9級(jí)特大地震影響妓布,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宋梧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一匣沼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捂龄,春花似錦释涛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至刀脏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間超凳,已是汗流浹背愈污。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轮傍,地道東北人暂雹。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像创夜,于是被迫代替她去往敵國(guó)和親杭跪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容