[Liferay6.2]Liferay Dynamic Query API樣本

來源:互聯網
上載者:User

標籤:

介紹

Liferay提供了幾種方法定義複雜的查詢用來檢索資料庫中的資料。

通常情況下,在每個service Entity中,通過定義一些‘finder‘方法,可以便捷地滿足基本的資料查詢操作。

但是,有時候我們可能會遇到以下幾種finder查詢並不能滿足的情況:

  • 過於複雜的查詢,例如子查詢
  • 需要實現一些彙總操作,像min、max、avg等
  • 想得到綜合物件或元組而不是映射的物件類型
  • 查詢最佳化
  • 複雜的資料訪問,像報表等

要實現這個目的,就需要通過Liferay提供的Hibernate的Dynamic Query API實現。

在本文中,我們將示範如何構建不同類型的Dynamic Query並執行它們。

Dynamic Query基本文法

在Liferay中構建一個Dynamic Query基本文法的代碼如下:

//構建動態查詢,相當於select * from Entity_NameDynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Entity_Name.class);//DynamicQueryFactoryUtil.forClass(Entity_Name.class,PortalClassLoaderUtil.getClassLoader());//設定查詢列dynamicQuery.setProjection(Projection projection);//設定查詢條件dynamicQuery.add(Criterion criterion);//設定定序dynamicQuery.addOrder(Order order);//設定返回結果集的範圍dynamicQuery.setLimit(int start, int end);//執行動態查詢,得到結果集Entity_NameLocalServiceUtil.dynamicQuery(dynamicQuery);

其中,

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

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

Dynamic Query應用樣本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 ‘組織機構%‘;dynamicQuery.add(PropertyFactoryUtil.forName("parentOrganizationId").like("組織機構%"));// 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=‘組織機構1‘);DynamicQuery subDynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class);subDynamicQuery.setProjection(ProjectionFactoryUtil.property("organizationId"));subDynamicQuery.add(PropertyFactoryUtil.forName("name").eq("組織機構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彙總函式調用方法如下:

max:ProjectionFactoryUtil.max(String propertyName)

其他彙總函式min、avg等可參考遞推。

10、分頁
// 取第1條到第10條記錄dynamicQuery.setLimit(0,10);
11、複合主鍵

如果實體是符合主鍵,我們要通過複合主鍵中的屬性列進行查詢的話,則需要在列名前面加上"primaryKey.",如下:

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

以上只是一些基本的樣本,能夠解決我們在日常開發中遇到的大部分問題,此外Dynamic Query API也提供了一些更進階的擴充方法(eqAll、geAll等),這些大家就一起探索吧,以後用到再更新。

通過以上樣本,我們可以看到Liferay提供的Dynamic Query API,其實就是通過一組java方法來組成SQL語句,執行並獲得結果。可能有些朋友會覺得這種方法太過於繁瑣,還不如直接寫SQL來得方便直接。但是站在平台資料庫相容性的角度考慮,我們就會發現這種方式非常合適。因為liferay支援mysql、oracle、db2等多種資料庫,如果直接寫SQL的話,很可能碰到其他資料庫的文法不支援的情況發生,像oracle中的遞迴查詢mysql就不支援等。使用Dynamic Query API的話,我們就可以使用一套統一的文法來構建SQL語句,而不需要考慮底層資料庫的差異,這樣整個平台的移植性和相容性就顯著提高了很多。

 

[Liferay6.2]Liferay Dynamic Query API樣本

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.