最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?JPA使用CriteriaBuilder動(dòng)態(tài)構(gòu)造查詢方式

 更新時(shí)間:2021年12月07日 09:25:58   作者:一路斜陽(yáng)  
這篇文章主要介紹了Spring?JPA使用CriteriaBuilder動(dòng)態(tài)構(gòu)造查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Spring JPA使用CriteriaBuilder動(dòng)態(tài)構(gòu)造查詢

在使用Spring JPA提供的方法只能進(jìn)行簡(jiǎn)單的CRUD,如果遇到復(fù)雜的情況就需要我們動(dòng)態(tài)來(lái)構(gòu)建查詢條件了。這里我們來(lái)看使用CriteriaBuilder如何來(lái)構(gòu)造查詢。

核心代碼:

 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
 CriteriaQuery<Long> query = criteriaBuilder.createQuery(Long.class);
 Root<Order> root = query.from(Order.class);
 query.select(criteriaBuilder.count(root.get("id")));
 Predicate predicate = criteriaBuilder.equal(root.get("id"), 1);
 query.where(predicate);
 Long singleResult = entityManager.createQuery(query).getSingleResult();

調(diào)用entityManager.getCriteriaBuilder()來(lái)獲取CriteriaBuilder。CriteriaBuilder可以用于創(chuàng)建CriteriaQuery、CriteriaUpdate和CriteriaDelete。除此之外類似count、max等函數(shù)也是由CriteriaBuilder來(lái)創(chuàng)建的。其中Entitymanager可以使用@PersistenceContext注解來(lái)進(jìn)行注入。

調(diào)用criteriaBuilder.createQuery來(lái)創(chuàng)建CriteriaQuery。其中createQuery的參數(shù)是Query返回值類型。

調(diào)用query.from(Order.class)。參數(shù)是對(duì)應(yīng)于order表的實(shí)體類,query.from類似于sql中的from語(yǔ)句,該方法的執(zhí)行等價(jià)于sql中的from order。

調(diào)用 query.select創(chuàng)建映射。 query.select(criteriaBuilder.count(root.get(“id”)))等價(jià)于select count(id)。如果執(zhí)行query.select(root)則等價(jià)于select *。

使用CriteriaBuilder構(gòu)造查詢條件Predicate,該predicate也就是在where后面的條件子句。

將Predicate放在 query.where中。

最后執(zhí)行查詢獲取數(shù)據(jù)。

JPA CriteriaBuilder中一些運(yùn)算的使用

最近使用jpa時(shí),需要使用訂單中的金額除以單價(jià)算出每個(gè)訂單的數(shù)量,然后求和。找了好多資料才解決,在此整理一下。

首先了解一下CriteriaBuilder的一些運(yùn)算

// Create path and parameter expressions:
  Expression<Integer> path = country.get("population");
  Expression<Integer> param = cb.parameter(Integer.class);
  // Addition (+)
  Expression<Integer> sum1 = cb.sum(path, param); // expression + expression
  Expression<Integer> sum2 = cb.sum(path, 1000); // expression + number
  Expression<Integer> sum3 = cb.sum(1000, path); // number + expression
  // Subtraction (-)
  Expression<Integer> diff1 = cb.diff(path, param); // expression - expression
  Expression<Integer> diff2 = cb.diff(path, 1000); // expression - number
  Expression<Integer> diff3 = cb.diff(1000, path); // number - expression
  // Multiplication (*)
  Expression<Integer> prod1 = cb.prod(path, param); // expression * expression
  Expression<Integer> prod2 = cb.prod(path, 1000); // expression * number
  Expression<Integer> prod3 = cb.prod(1000, path); // number * expression
  // Division (/)
  Expression<Integer> quot1 = cb.quot(path, param); // expression / expression
  Expression<Integer> quot2 = cb.quot(path, 1000); // expression / number
  Expression<Integer> quot3 = cb.quot(1000, path); // number / expression
  // Modulo (%)
  Expression<Integer> mod1 = cb.mod(path, param); // expression % expression
  Expression<Integer> mod2 = cb.mod(path, 1000); // expression % number
  Expression<Integer> mod3 = cb.mod(1000, path); // number % expression
  // Math(abs, exp, sqrt)
  Expression<Integer> abs = cb.abs(param); // 求絕對(duì)值A(chǔ)BS(expression)
  Expression<Integer> neg = cb.neg(path); // 求相反數(shù) -expression
  Expression<Integer> sqrt = cb.sqrt(cb.literal(100)); //求平方根 SQRT(expression)

由于CriteriaBuilder提供的加減乘除方法的名字和平常使用的不太一樣,所以用了好久才找出來(lái)。

單字段求和可以直接使用

CriteriaBuilder cb = em.getCriteriaBuilder();
Expression<Number> sum = cb.sum(root.get(字段名)).alias(別名)

前邊也說(shuō)了需求是用金額(amount)除以單價(jià)(unitPrice),然后求和,所以這時(shí)需要先用amount除以u(píng)nitPrice

Expression<Number> quot = cb.quot(root.get("amount"), root.get("unitPrice"));

算出數(shù)量后就可以使用sum求和了。

cb.sum(quot)

完事之后,還需要對(duì)數(shù)據(jù)四舍五入,需要用到mysql的round方法

在CriteriaBuilder沒有找到round方法,那怎么辦呢?沒關(guān)系,CriteriaBuilder還提供了function方法,在function方法里可以直接傳方法名進(jìn)去

/**
name: 方法名
returnType: 返回類型
arguments:表達(dá)式
**/
public <T> Expression<T> function(String name, Class<T> returnType, Expression... arguments) {
        return new ParameterizedFunctionExpression(this, returnType, name, arguments);
    }

調(diào)用代碼如下

Expression<BigDecimal> round = cb.function("round", BigDecimal.class, quot);

到這一步發(fā)現(xiàn),還需要保留兩位小數(shù)??墒?,Expression里 沒有相關(guān)的方法。天無(wú)絕人之路,在看了cb.function()后發(fā)現(xiàn),這個(gè)方法的最后一個(gè)參數(shù)是可變參數(shù),所以上邊的代碼改成了如下

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
Expression<Integer> size = cb.size(list);
Expression<BigDecimal> round = cb.function("round", BigDecimal.class, quot,size);

至此,完成了先求兩列的商,然后對(duì)商求和的功能。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring-基于Spring使用自定義注解及Aspect實(shí)現(xiàn)數(shù)據(jù)庫(kù)切換操作

    Spring-基于Spring使用自定義注解及Aspect實(shí)現(xiàn)數(shù)據(jù)庫(kù)切換操作

    這篇文章主要介紹了Spring-基于Spring使用自定義注解及Aspect實(shí)現(xiàn)數(shù)據(jù)庫(kù)切換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 這一次搞懂Spring的XML解析原理說(shuō)明

    這一次搞懂Spring的XML解析原理說(shuō)明

    這篇文章主要介紹了這一次搞懂Spring的XML解析原理說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • IDEA使用Gradle構(gòu)建SpringBoot項(xiàng)目工程的詳細(xì)教程

    IDEA使用Gradle構(gòu)建SpringBoot項(xiàng)目工程的詳細(xì)教程

    這篇文章主要介紹了IDEA使用Gradle構(gòu)建SpringBoot項(xiàng)目工程的教程詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Spring Boot 如何使用Liquibase 進(jìn)行數(shù)據(jù)庫(kù)遷移(操作方法)

    Spring Boot 如何使用Liquibase 進(jìn)行數(shù)據(jù)庫(kù)遷移(操作方法)

    在Spring Boot應(yīng)用程序中使用Liquibase進(jìn)行數(shù)據(jù)庫(kù)遷移是一種強(qiáng)大的方式來(lái)管理數(shù)據(jù)庫(kù)模式的變化,本文重點(diǎn)講解如何在Spring Boot應(yīng)用程序中使用Liquibase進(jìn)行數(shù)據(jù)庫(kù)遷移,從而更好地管理數(shù)據(jù)庫(kù)模式的變化,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • 深入了解JAVA 虛引用

    深入了解JAVA 虛引用

    這篇文章主要介紹了JAVA 虛引用的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)JAVA,感興趣的朋友可以了解下
    2020-08-08
  • Java開發(fā)中可以防止界面假死的刷新代碼

    Java開發(fā)中可以防止界面假死的刷新代碼

    今天小編就為大家分享一篇關(guān)于Java開發(fā)中可以防止界面假死的刷新代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Spring中RedisTemplate的基本使用淺析

    Spring中RedisTemplate的基本使用淺析

    Spring Boot Data(數(shù)據(jù)) Redis中提供了RedisTemplate和StringRedisTemplate,其中StringRedisTemplate是RedisTemplate的子類,兩個(gè)方法基本一致。本文介紹了Spring操作Redis的方法,需要的可以參考一下
    2023-02-02
  • java實(shí)現(xiàn)的連接數(shù)據(jù)庫(kù)及模糊查詢功能示例

    java實(shí)現(xiàn)的連接數(shù)據(jù)庫(kù)及模糊查詢功能示例

    這篇文章主要介紹了java實(shí)現(xiàn)的連接數(shù)據(jù)庫(kù)及模糊查詢功能,結(jié)合實(shí)例形式分析了java基于jdbc連接數(shù)據(jù)庫(kù)及使用LIKE語(yǔ)句實(shí)現(xiàn)模糊查詢功能的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • JDK1.7以上javaFTP上傳刪除文件的實(shí)現(xiàn)方法

    JDK1.7以上javaFTP上傳刪除文件的實(shí)現(xiàn)方法

    下面小編就為大家分享一篇JDK1.7以上javaFTP上傳刪除文件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • idea中如何過(guò)濾某些文件不提交的方法實(shí)現(xiàn)

    idea中如何過(guò)濾某些文件不提交的方法實(shí)現(xiàn)

    本文主要介紹了idea中如何過(guò)濾某些文件不提交,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論

达州市| 当雄县| 安图县| 安龙县| 涞源县| 鄂托克前旗| 栖霞市| 德令哈市| 黑水县| 宜宾县| 蒲城县| 拜城县| 宽甸| 昌黎县| 宣化县| 六枝特区| 湘阴县| 龙游县| 饶阳县| 柞水县| 郓城县| 上栗县| 台中县| 江口县| 巫山县| 阿拉善盟| 夹江县| 鄂伦春自治旗| 林口县| 克拉玛依市| 彭阳县| 汨罗市| 尼木县| 华池县| 洮南市| 安岳县| 府谷县| 西乌珠穆沁旗| 涪陵区| 西青区| 福清市|