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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

liferay Dynamic Query 查询

發(fā)布時(shí)間:2023/12/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 liferay Dynamic Query 查询 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹

Liferay提供了幾種方法定義復(fù)雜的查詢用來(lái)檢索數(shù)據(jù)庫(kù)中的數(shù)據(jù)。

通常情況下,在每個(gè)service Entity中,通過(guò)定義一些'finder'方法,可以便捷地滿足基本的數(shù)據(jù)查詢操作。

但是,有時(shí)候我們可能會(huì)遇到以下幾種finder查詢并不能滿足的情況:

  • 過(guò)于復(fù)雜的查詢,例如子查詢
  • 需要實(shí)現(xiàn)一些聚合操作,像min、max、avg等
  • 想得到復(fù)合對(duì)象或元組而不是映射的對(duì)象類型
  • 查詢優(yōu)化
  • 復(fù)雜的數(shù)據(jù)訪問(wèn),像報(bào)表等

要實(shí)現(xiàn)這個(gè)目的,就需要通過(guò)Liferay提供的Hibernate的Dynamic Query API實(shí)現(xiàn)。

在本文中,我們將演示如何構(gòu)建不同類型的Dynamic Query并執(zhí)行它們。

Dynamic Query基本語(yǔ)法

在Liferay中構(gòu)建一個(gè)Dynamic Query基本語(yǔ)法的代碼如下:

//構(gòu)建動(dòng)態(tài)查詢,相當(dāng)于select * from Entity_Name DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Entity_Name.class); //DynamicQueryFactoryUtil.forClass(Entity_Name.class,PortalClassLoaderUtil.getClassLoader()); //設(shè)置查詢列 dynamicQuery.setProjection(Projection projection); //設(shè)置查詢條件 dynamicQuery.add(Criterion criterion); //設(shè)置排序規(guī)則 dynamicQuery.addOrder(Order order); //設(shè)置返回結(jié)果集的范圍 dynamicQuery.setLimit(int start, int end); //執(zhí)行動(dòng)態(tài)查詢,得到結(jié)果集 Entity_NameLocalServiceUtil.dynamicQuery(dynamicQuery);

其中,

Entity_Name:實(shí)體名稱,就是service.xml中制定的Entity名稱。

DynamicQuery也可以通過(guò)DynamicQuery forClass(Class<?> clazz, ClassLoader classLoader)來(lái)初始化。

Dynamic Query應(yīng)用示例

1、select * from organization_;

DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class); List<Organization> Organizations = OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery);

2、select * from organization_ where parentOrganizationId=0;

DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class); dynamicQuery.add(PropertyFactoryUtil.forName("parentOrganizationId").eq(0L)); List<Organization> Organizations = OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery);

3、like、>、>=、<、<=、between ... and ...

  • // select * from organization_ where name like '組織機(jī)構(gòu)%';

  • dynamicQuery.add(PropertyFactoryUtil.forName("parentOrganizationId").like("組織機(jī)構(gòu)%"));

  • // select * from organization_ where organizationId >21212;

  • dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").gt(21212L));

  • // select * from organization_ where organizationId >=21212;

  • dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").ge(21212L));

  • // select * from organization_ where organizationId <21224;

  • dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").lt(21224L));

  • // select * from organization_ where organizationId <=21224;

  • dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").le(21224L));

  • // select * from organization_ where organizationId between 21212 and 21224;

  • dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").between(21212L, 21224L));

  • 4、and / or

    // select * from organization_ where organizationId >= 21212 and organizationId <=21224; // 第1種方法(不適用于or) dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").ge(21212L)); dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").le(21224L)); // 第2種方法(適用于or,使用RestrictionsFactoryUtil.or) Criterion criterion = null; criterion = RestrictionsFactoryUtil.ge("organizationId", 21212L); criterion = RestrictionsFactoryUtil.and(criterion, RestrictionsFactoryUtil.le("organizationId", 21224L)); dynamicQuery.add(criterion); // 第3種方法(適用于or,使用RestrictionsFactoryUtil.disjunction()) Junction junction = RestrictionsFactoryUtil.conjunction(); junction.add(PropertyFactoryUtil.forName("organizationId").ge(21212L)); junction.add(PropertyFactoryUtil.forName("organizationId").le(21224L)); dynamicQuery.add(junction);

    5、order by

  • // select * from organization_ order by organizationId asc;

  • dynamicQuery.addOrder(OrderFactoryUtil.asc("organizationId"));

  • // select * from organization_ order by organizationId desc;

  • dynamicQuery.addOrder(OrderFactoryUtil.desc("organizationId"));

  • 6、子查詢

    // select * from organization_ where parentOrganizationId=(select organizationId from organization_ where name='組織機(jī)構(gòu)1'); DynamicQuery subDynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class); subDynamicQuery.setProjection(ProjectionFactoryUtil.property("organizationId")); subDynamicQuery.add(PropertyFactoryUtil.forName("name").eq("組織機(jī)構(gòu)1")); dynamicQuery.add(PropertyFactoryUtil.forName("parentOrganizationId").in(subDynamicQuery));

    7、自定義列

    // select name from organization_; dynamicQuery.setProjection(ProjectionFactoryUtil.property("name")); List<Object> names = OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery); for(Object name: names){System.out.println(name); } // select organizationId,name from organization_; ProjectionList projectionList = ProjectionFactoryUtil.projectionList(); projectionList.add(ProjectionFactoryUtil.property("organizationId")); projectionList.add(ProjectionFactoryUtil.property("name")); dynamicQuery.setProjection(projectionList); List<Object[]> organizations = OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery); for(Object[] organization: organizations){System.out.println(organization[0]+":"+organization[1]); }

    8、distinct

  • // select distinct name from organization_;

  • Projection projection = ProjectionFactoryUtil.distinct(ProjectionFactoryUtil.property("name"));

  • dynamicQuery.setProjection(projection);

  • 9、group by

    // select type_,count(type_) from organization_ group by type_; ProjectionList projectionList = ProjectionFactoryUtil.projectionList(); projectionList.add(ProjectionFactoryUtil.property("type")); projectionList.add(ProjectionFactoryUtil.count("name")); projectionList.add(ProjectionFactoryUtil.groupProperty("type")); dynamicQuery.setProjection(projectionList); List<Object[]> organizations = OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery); for(Object[] organization: organizations){System.out.println(organization[0]+":"+organization[1]); }

    此外,max聚合函數(shù)調(diào)用方法如下:

    max:ProjectionFactoryUtil.max(String propertyName)

    其他聚合函數(shù)min、avg等可參考遞推。

    10、分頁(yè)

    // 取第1條到第10條記錄 dynamicQuery.setLimit(0,10);

    11、復(fù)合主鍵

    如果實(shí)體是符合主鍵,我們要通過(guò)復(fù)合主鍵中的屬性列進(jìn)行查詢的話,則需要在列名前面加上"primaryKey.",如下:

    dynamicQuery.add(PropertyFactoryUtil.forName("primaryKey.organizationId").gt(21212L));

    總結(jié)

    以上只是一些基本的示例,能夠解決我們?cè)谌粘i_(kāi)發(fā)中遇到的大部分問(wèn)題,此外Dynamic Query API也提供了一些更高級(jí)的擴(kuò)展方法(eqAll、geAll等),這些大家就一起探索吧,以后用到再更新。

    通過(guò)以上示例,我們可以看到Liferay提供的Dynamic Query API,其實(shí)就是通過(guò)一組java方法來(lái)組成SQL語(yǔ)句,執(zhí)行并獲得結(jié)果。?可能有些朋友會(huì)覺(jué)得這種方法太過(guò)于繁瑣,還不如直接寫SQL來(lái)得方便直接。?但是站在平臺(tái)數(shù)據(jù)庫(kù)兼容性的角度考慮,我們就會(huì)發(fā)現(xiàn)這種方式非常合適。?因?yàn)閘iferay支持mysql、oracle、db2等多種數(shù)據(jù)庫(kù),如果直接寫SQL的話,很可能碰到其他數(shù)據(jù)庫(kù)的語(yǔ)法不支持的情況發(fā)生,像oracle中的遞歸查詢mysql就不支持等。?使用Dynamic Query API的話,我們就可以使用一套統(tǒng)一的語(yǔ)法來(lái)構(gòu)建SQL語(yǔ)句,而不需要考慮底層數(shù)據(jù)庫(kù)的差異,這樣整個(gè)平臺(tái)的移植性和兼容性就顯著提高了很多。

    總結(jié)

    以上是生活随笔為你收集整理的liferay Dynamic Query 查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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