`
chinasb
  • 浏览: 2619 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Liferay自定义原生态SQL查询

阅读更多

原文:http://www.chinasb.org/archives/2010/12/1313.shtml

首先,Liferay内置的ServiceBuilder工具十分强大,基本上的数据库操作都可以通过自动生成的方法去实现。但是某些复杂的方法就需要使用到自定义SQL查询了,本文以一个例子向大家介绍如何在Liferay的开发中使用原生态SQL执行数据库操作。(以下操作基于ext开发环境)

1.在portal-ext.properties添加

custom.sql.configs=custom-sql/default.xml,custom-sql/default-ext.xml

2.新建ext-impl/src/custom-sql/default-ext.xml与ext-impl/src/custom-sql/book.xml(例子自定义SQL文件)

default-ext.xml:

<?xml version="1.0"?>

<custom-sql>
	<sql file="custom-sql/book.xml" />
</custom-sql>

book.xml:

<?xml version="1.0"?>

<custom-sql>
  <sql id="com.xxx.xxx.portlet.book.service.persistence.BookFinder.countByUserId">
    <![CDATA[
		SELECT
			*
		FROM
			BOOK
		WHERE
			USERID = ?
	]]>
  </sql>
</custom-sql>

解析一下:sql id="com.xxx.xxx.portlet.book.service.persistence.BookFinder.countByUserId",这里指定BookFinder接口的countByUserId方法去执行自定义的SQL语句:SELECT * FORM BOOK WHERE USERID = ?(这里就不用说了吧,?代表一个参数)

好了,接下来我们利用Liferay的强大的ServiceBuilder工具为我们生成BookFinder的接口和相应的Util类。

3.新建com.xxx.xxx.portlet.book.service.persistence.BookFinderImpl.java(即是BookFinder接口的实现类,这里一定要注意命名规范:实体名加FinderImpl)

BookFinderImpl.java:

public class BookFinderImpl extends BasePersistenceImpl implements BookFinder {

	public static String COUNT_BY_USER_ID = BookFinder.class.getName()
			+ ".countByUserId";

	public int countByUserId(long userId) throws SystemException {

		Session session = null;

		try {
			session = openSession();

			return countByUserId(session, userId);
		} catch (Exception e) {
			throw new SystemException(e);
		} finally {
			closeSession(session);
		}
	}

	protected int countByUserId(Session session, long userId) {

		String sql = CustomSQLUtil.get(COUNT_BY_USER_ID);

		_log.info("SQL:" + sql);

		SQLQuery q = session.createSQLQuery(sql);

		QueryPos qPos = QueryPos.getInstance(q);

		qPos.add(userId);

		return q.list().size();
	}

	public List<Book> findByUserId(long userId, int start, int end) throws SystemException {

		Session session = null;

		try {
			session = openSession();

			return findByUserId(session, userId, start, end);
		} catch (Exception e) {
			throw new SystemException(e);
		} finally {
			closeSession(session);
		}
	}

	protected List<Book> findByUserId(Session session, long userId, int start, int end) {

		String sql = CustomSQLUtil.get(COUNT_BY_USER_ID);

		_log.info("SQL:" + sql);

		SQLQuery q = session.createSQLQuery(sql);

		q.addEntity("Book", BookImpl.class);

		QueryPos qPos = QueryPos.getInstance(q);

		qPos.add(userId);

		return (List<Book>)QueryUtil.list(q, getDialect(), start, end);
	}

	private static Log _log = LogFactory.getLog(BookFinderImpl.class);
}

解析一下:BookFinderImpl记得继承自BasePersistenceImpl并且实现BookFinder接口(放心,一会让service build去帮我们生成这个接口),这里有两个方法,一个是实现查询总数,一个是实现分页查询实体数据。细心你的发现没有,其实Liferay用的也就是自已封装过的SQLQuery去执行原生态SQL,把SQL定义在XML完全是为了达到解耦的一种效果,如果你懒点,完全可以直接:

SQLQuery q = session.createSQLQuery("SELECT * FROM BOOK WHERE USERID = ?");

QueryPos qPos = QueryPos.getInstance(q);

qPos.add(userId);

q.list()执行后返回的是一个对象数组List,如果要转换成实体对象的List,必须用以下方法:

q.addEntity("Book", BookImpl.class);

List<Book> books = (List<Book>)QueryUtil.list(q, getDialect(), start, end);

好了,马上ant service build一下,将会生成你需要的接口与Util类了。这样还不够,要在视图层调用ServiceBuilder给你生成了专用的BookLocalServiceUtil工具类,所以还要再麻烦一下。

4.修改com.xxx.xxx.portlet.book.service.impl.BookLocalServiceImpl.java,加入要供外部调用的两个方法

	public int getCountByUserId(long userId) throws SystemException {
		return BookFinderUtil.countByUserId(userId);
	}

	public List<Book> getBooksByUserId(long userId, int start, int end) throws SystemException {
		return BookFinderUtil.findByUserId(userId, start, end);
	}

5.最后再次ant build service,让ServiceBuilder工具帮你生成相应的接口就可以在你的action里进行调用了。

分享到:
评论

相关推荐

    Liferay 自定义字段

    在英文文档中,可能会详细介绍如何通过Liferay的API、服务和portlet来编程式地操作自定义字段,包括创建、更新、查询和删除。对于开发者来说,理解Expando表的结构和使用ExpandoBridge API是非常关键的。Expando表是...

    liferay-portal-sql-6.1.1-ce-ga2-20120731132656558

    6. **自定义扩展**:可能还包括一些用户自定义的SQL脚本,用于扩展Liferay的功能或者适应特定业务需求。 7. **示例脚本**:为了帮助用户理解和学习如何与Liferay的数据库交互,可能包含一些示例脚本。 使用这些SQL...

    Liferay7.0自定义登录实例

    在本文中,我们将深入探讨如何在Liferay 7.0中实现自定义登录实例。Liferay是一款开源的企业级门户平台,提供了丰富的功能和强大的定制能力,使得开发者可以根据具体需求进行扩展。自定义登录界面和流程是提升用户...

    liferay portal sql 6.0.6

    6. **报表和分析**:Liferay内置的报表引擎可能依赖于SQL查询来生成数据报告。这个版本可能提供了更多预定义的报表或者改进了查询性能。 7. **多语言支持**:Liferay Portal支持多种语言,这需要在数据库中存储各种...

    liferay-portal-sql-6.1.2-ce-ga3-20130816114619181

    3. **索引和约束**:为了提高查询效率和数据完整性,Liferay会定义一系列索引和约束条件。 4. **示例数据**:部分SQL脚本可能包含了示例数据,帮助用户快速理解Liferay的工作方式。 在移植过程中,需要注意以下几...

    custom-login-portlet:Liferay 自定义登录 Portlet

    在Liferay Portal中,开发一个自定义登录Portlet可以极大地扩展平台的功能,满足特定的用户认证和授权需求。本文将深入探讨如何创建和配置`custom-login-portlet`,这是一个基于Java技术实现的Liferay插件。 首先,...

    portal 自定义查询

    Liferay自定义查询是Liferay Portal的一个强大特性,它为管理员和开发人员提供了构建和分享自定义数据集的能力,而无需深入到数据库层面进行SQL查询。这种灵活性使得非技术用户也能通过用户友好的界面来访问和管理...

    liferay-portal-sql-oracle-10-5.2.3.dmp

    liferay-portal-sql-oracle-10-5.2.3.dmp

    liferay主题开发

    liferay主题开发的一般步骤以及具体事例

    sql Server liferay 的数据导入.

    ### SQL Server Liferay 数据导入详解 #### 一、概述 SQL Server Liferay 数据导入是指将Liferay中的数据迁移到SQL Server数据库的过程。这对于那些希望利用SQL Server的强大功能和稳定性来支持Liferay应用的企业来...

    利用Liferay开发portal应用(插件)

    首先,Liferay的插件开发是基于其插件开发框架(Plugin SDK)进行的,它为开发者提供了便捷的工具和结构来创建自定义功能。这些插件可以是门户布局、portlet、主题、钩子、服务包等,极大地增强了Liferay的功能和...

    liferay-custom-fragments:Liferay的自定义片段的集合

    在Liferay Portal中,自定义片段(Custom Fragments)是一种强大的功能,允许用户根据自己的需求对门户布局进行个性化。这个“liferay-custom-fragments”项目是一个集合,提供了多种自定义片段示例,帮助开发者更好...

    liferay扩展环境 liferay ext

    Liferay是一个开源的企业级内容管理平台,它允许用户根据需求构建自定义的数字体验。Liferay Ext允许开发者在不修改核心代码的情况下对Liferay进行高级定制,这包括添加新的portlet、服务、主题以及系统级别的配置。...

    Liferay Portal Liferay IDE

    Liferay Portal Liferay IDE

    liferay 超级学习文档

    此外,还可以尝试自定义Liferay的主题,以满足特定的UI需求。 六、资源和社区 Liferay拥有活跃的开发者社区,提供了丰富的在线资源,如官方文档、论坛、博客和GitHub上的源码。这些资源可以帮助你解决在学习过程中...

    liferay详细讲解 liferay项目完全讲解

    JFC(Java Foundation Classes)和Swing是Java GUI编程的重要工具,Liferay允许开发者使用Swing组件创建自定义portlet,以提供丰富的用户交互体验。通过这份文档,我们可以深入学习Swing组件的使用,从而更好地设计...

    liferay经典书籍8本

    对于希望自定义Liferay外观的设计师或开发者来说,这本书是必备读物。它讲解了CSS、HTML和JS在Liferay主题中的应用,以及如何使用FreeMarker和Velocity模板语言来创建响应式和动态主题。 5. 《Liferay Social ...

    liferay性能调优文档

    优化SQL查询,创建合适的索引,以及定期进行数据库维护(如清理过期数据)都是必要的。此外,选择适合业务需求的数据库引擎也很重要,例如InnoDB对于事务处理有更好的支持。 5. **插件和主题性能**:Liferay允许...

    liferay快速入门quickstart

    - **主题更换:**通过Liferay的外观管理功能,用户能够自定义网站的主题和布局,实现个性化设计。 - **内容管理系统:**Liferay内置的CMS允许用户编辑和发布网页内容,支持文档管理、版本控制等特性,简化了网站内容...

    liferay6.2开发指南.pdf

    - **主题(Themes)**:主题是改变 Liferay 界面外观的关键,开发者可以通过创建自定义主题来改变色彩、布局、字体等,以满足品牌一致性或个性化需求。 #### 1-4 节 选择你的开发工具 Liferay 提供了与多种开发工具...

Global site tag (gtag.js) - Google Analytics