日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

CUBA使用Spring查询接口

發(fā)布時間:2023/12/20 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CUBA使用Spring查询接口 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

根本原因

開發(fā)人員通常不喜歡改變他們編碼的習慣。當我剛才是接觸?CUBA?的時候,發(fā)現(xiàn)不需要學很多新的東西,創(chuàng)建應用程序的過程也是非常順利的。但是其中有一樣是需要重新學習的,那就是如何使用數(shù)據(jù)。

在Spring框架中,有好幾個庫可以用來處理數(shù)據(jù),其中最流行的一個就是?spring-data-jpa,使用這個庫可以使開發(fā)人員在很多情況下避免編寫SQL或者JPQL。只需要創(chuàng)建一個接口類,然后在接口中創(chuàng)建?帶有特殊名稱?的方法,Spring會自動幫你創(chuàng)建和執(zhí)行查詢語句。

比如,這里有一個接口,其中有個方法是統(tǒng)計有多少客戶是同一個姓的:

interface CustomerRepository extends CrudRepository<Customer, Long> {long countByLastName(String lastName); }

可以直接將這個接口注入到service中,然后就可以在需要的地方調(diào)用這個方法了(注意,不需要寫實現(xiàn)類)。

CUBA提供了很多開箱即用的數(shù)據(jù)操控方法,比如加載實體的部分屬性以及成熟的數(shù)據(jù)安全子系統(tǒng) - 可以限制數(shù)據(jù)訪問權限至實體屬性和表數(shù)據(jù)的行級別。并且這些所有的功能都帶有API,但是跟大家都知道的Spring Data或者JPA/Hibernate的略有不同。

所以,為什么在CUBA中沒有上面說的查詢接口?有沒有可能添加呢?

CUBA中使用數(shù)據(jù)的方式

CUBA的API中有三個主要的類用來處理數(shù)據(jù):DataStore,EntityManager 和 DataManager。

DataStore?的抽象是提供處理持久化存儲的API,比如RDBMS,文件系統(tǒng)或者云存儲。可以通過DataStore執(zhí)行基本的數(shù)據(jù)操作,但是,不推薦直接使用DataStore,除非需要開發(fā)自定義的持久化存儲或者需要對底層存儲進行非常特殊的訪問。

EntityManager?很大程度上只是JPA EntityManager 的拷貝,但是有額外的方法用來處理?CUBA視圖、軟刪除以及?CUBA 查詢語句。作為CUBA開發(fā)人員,很少在日常工作中使用這個類,除非需要克服CUBA的安全限制。

下一個要說的,DataManager,是在CUBA中處理數(shù)據(jù)主要使用的類。此類提供了處理數(shù)據(jù)的API并且支持到屬性和行級別的?CUBA安全模型?。當查詢數(shù)據(jù)的時候,DataManager會隱式的修改查詢語句。比如,在關系型數(shù)據(jù)庫中,它會更改“select”語句,排除那些受限的屬性,然后自動添加“where”語句來篩選那些當前用戶不能看到的數(shù)據(jù)行。這種安全感知的行為是很有幫助的,開發(fā)人員不需要死記在查詢語句中需要添加哪些關于安全方面的條件。

這里有個CUBA類交互的圖,展示使用DataManager從RDBMS中獲取數(shù)據(jù)的過程。

使用DataManager可以相對容易的查詢實體(或者使用CUBA視圖查詢實體層級結(jié)構(gòu))。最簡單的查詢是這樣:

dataManager.load(Customer.class).list()

DataManager會自己過濾掉“軟刪除”的記錄、受限制訪問的實體屬性或?qū)嶓w,也會自己創(chuàng)建數(shù)據(jù)庫事務。

但是如果需要執(zhí)行帶有復雜“where”條件的查詢語句,就需要寫JPQL了。

看看最開頭那個例子,如果需要按姓統(tǒng)計客戶人數(shù),在CUBA中需要寫這樣的:

public Long countByLastName(String lastName){return dataManager.loadValue("select count(c) from sample$Customer c where c.lastName = :lastName", Long.class).parameter("lastName", lastName).one(); }public Long countByLastName(String lastName){LoadContext<Person> loadContext = LoadContext.create(Person.class);loadContext.setQueryString("select c from sample$Customer c where c.lastName = :lastName").setParameter("lastName", lastName);return dataManager.getCount(loadContext); }

這里可以看到,需要將JPQL語句丟給DataManager去執(zhí)行。在CUBA API里,JPQL需要用字符串來定義(目前還不支持Criteria API)。JPQL有很好的可讀性,也能清晰的定義一個查詢語句,但是如果出問題,可能不是很好調(diào)試。另外,JPQL字符串不像Criteria API那樣能在構(gòu)建編譯時進行驗證,或者在Spring上下文初始化的時候驗證。

比較一下Spring Data JPA 的接口:

interface CustomerRepository extends CrudRepository<Customer, Long> {long countByLastName(String lastName); }

這個接口只有三分之一的代碼量而且不包含任何顯式的字符串。此外,countByLastName 方法會在部署階段驗證。如果方法名敲錯了,比如,敲成 countByLastNome,則會有異常拋出:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property LastNome found for type Customer!

由于CUBA也是基于Spirng框架構(gòu)建的,所以可以將Spring-data-jpa添加為CUBA項目的依賴庫然后使用這個功能。唯一的問題,Spring的查詢接口底層使用JPA的EntityManager,所以查詢語句不會被CUBA的EntityManager或者DataManager處理。因此,需要找到合適的方法在CUBA中添加查詢接口 - 需要自定義,所有調(diào)用EntityManager的地方都需要用CUBA的DataManager相應的方法替換,并且添加對CUBA視圖的支持。

也有人會說,使用Spring的方案不如CUBA的方案可控,因為不能控制生成查詢語句的過程。這是在便利性和抽象化級別之間的平衡問題,需要開發(fā)者決定到底使用那個方案。但是有個額外的處理數(shù)據(jù)的簡單方法總是沒壞處,盡管這也不是唯一的方法。

如果需要更多的控制,Spring里也有方法為接口指定查詢語句,所以這個方法也需要添加到CUBA。

實施

查詢接口使用?spring-data-commons?實現(xiàn),構(gòu)建為CUBA應用程序組件。這個庫包含實現(xiàn)自定義查詢接口的類,比如,Spring的spring-data-mongodb?庫就是基于這個實現(xiàn)的。Spring-data-commons利用代理技術來為聲明式查詢接口創(chuàng)建正確的實現(xiàn)。

在CUBA的上下文初始化期間,查詢接口的引用都會被生成的代理bean隱式替換。當開發(fā)人員調(diào)用接口方法時,相應的代理會進行攔截。然后代理根據(jù)方法名稱生成JPQL查詢,替換參數(shù)值,并交給DataManager執(zhí)行。下圖展示了模塊關鍵組件之間的簡單交互過程。

在CUBA中使用查詢接口

需要在項目的構(gòu)建文件中添加新的應用程序組件才能使用CUBA的查詢接口:

appComponent("com.haulmont.addons.cuba.jpa.repositories:cuba-jpa-repositories-global:0.1-SNAPSHOT")

XML配置文件也需要修改啟用查詢接口:

<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:repositories="http://www.cuba-platform.org/schema/data/jpa"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.cuba-platform.org/schema/data/jpa http://www.cuba-platform.org/schema/data/jpa/cuba-repositories.xsd"><!-- Annotation-based beans --><context:component-scan base-package="com.company.sample"/><repositories:repositories base-package="com.company.sample.core.repositories"/></beans:beans>

如果習慣使用注解而不是創(chuàng)建XML配置文件,可以用下面的方法啟用查詢接口:

@Configuration @EnableCubaRepositories public class AppConfig {//Configuration here }

啟用查詢接口后,可以在應用程序中創(chuàng)建并使用。下面是示例:

public interface CustomerRepository extends CubaJpaRepository<Customer, UUID> {long countByLastName(String lastName);List<Customer> findByNameIsIn(List<String> names);@CubaView("_minimal")@JpqlQuery("select c from sample$Customer c where c.name like concat(:name, '%')")List<Customer> findByNameStartingWith(String name); }

可以在接口方法上使用 @CubaView 和?@JpqlQuery 注解。第一個注解定義需要使用的視圖(如果沒有使用這個注解,默認使用“_local”視圖)。第二個注解是用來設置JPQL的,用在查詢語句不能通過方法名表示的時候。

查詢接口的應用程序組件是綁定到CUBA的“global”模塊,所以可以在“core”和“web”模塊定義和使用查詢接口,只是別忘了在相應的配置文件中啟用接口。接口使用的示例:

@Service(CustomerService.NAME) public class CustomerServiceBean implements PersonService {@Injectprivate CustomerRepository customerRepository;@Overridepublic List<Date> getCustomersBirthDatesByLastName(String name) {return customerRepository.findByNameStartingWith(name).stream().map(Customer::getBirthDate).collect(Collectors.toList());} }

結(jié)論

CUBA很靈活。如果覺得需要為應用程序添加新的功能,又不想等CUBA的新版本,很容易在不修改CUBA核心的情況下實施并添加到項目中。通過為CUBA添加查詢接口,我們希望能幫助開發(fā)人員更加有效的工作,更快的交付可靠的代碼。這個庫的第一個版本可以在GitHub找到,目前支持CUBA 6.10和更高版本。

總結(jié)

以上是生活随笔為你收集整理的CUBA使用Spring查询接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。