当前位置:首页 > Windows程序 > 正文

[Liferay6.2]Liferay Dynamic Query API示例

2021-03-28 Windows程序

Liferay提供了几种方法定义复杂的查询用来检索数据库中的数据。

通常情况下,在每个service Entity中,,通过定义一些‘finder‘方法,可以便捷地满足基本的数据查询操作。

但是,有时候我们可能会遇到以下几种finder查询并不能满足的情况:

过于复杂的查询,例如子查询

需要实现一些聚合操作,像min、max、avg等

想得到复合对象或元组而不是映射的对象类型

查询优化

复杂的数据访问,像报表等

要实现这个目的,就需要通过Liferay提供的Hibernate的Dynamic Query API实现。

在本文中,我们将演示如何构建不同类型的Dynamic Query并执行它们。

Dynamic Query基本语法

在Liferay中构建一个Dynamic Query基本语法的代码如下:

//构建动态查询,相当于select * from Entity_Name DynamicQuery 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、子查询

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69147.html