原文: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-portal-sql-6.1.1-ce-ga2-20120731132656558
Liferay7.0自定义登录实例
自定义登录portlet Liferay 自定义登录 Portlet。 网址:tariqliferay.blogspot.com
这是Liferay自定义查询,这是Liferay自定义查询
liferay-portal-sql-6.1.2-ce-ga3-20130816114619181.zip包,移植liferay建库需要用到
liferay-portal-sql-oracle-10-5.2.3.dmp
liferay主题开发的一般步骤以及具体事例
liferay portal sql 6.0.6
sql Server liferay 的数据导入,关于大量的数据导入时的处理
Liferay自定义片段 该项目已使用创建。 您可以在阅读如何管理该项目。
Liferay Portal Liferay IDE
Liferay Portal 的桌面是一个个性化的入口,提供了用户的个性化设置和自定义功能。桌面包括多个portlet,提供了不同的功能和服务。 Liferay Portal 的品质 Liferay Portal 的品质是一个个性化的设置,提供了用户的...
Liferay Portal 数据库介绍 Liferay Portal 数据库是指Liferay Portal系统中存储的所有数据,包括用户信息、组织...以上是Liferay Portal 数据库介绍的相关知识点,包括Layout 表的字段、页面布局的修改和查询语句等。
Liferay微信登录自动登录自定义登录
Liferay中的AUI框架,官方叫做Alloy,是一个UI超框架,能为浏览器的三方面,结构,风格和表现建立网络应用提供连续的简单的API。 它融合了三种设计语言:HTML, CSS 和 JAVA。 准确来说AUI是Liferay在YUI的基础上...
liferay portal 开发指南liferay portal 开发指南liferay portal 开发指南liferay portal 开发指南
liferay 超级学习文档 liferay 框架 java hibernate liferay 不用多说
打开Liferay IDE,Window-->Preferences-->Server-->Runtime Environment,点击右边Add…,在弹出的服务器选择里面选择Liferay,Inc-->Liferay v6.1 CE (Tomcat 7),请打“Create a new location server”打上勾。...
liferay开发文档.pdf Liferay 是一个基于Java的开源企业门户平台,提供了强大的门户解决方案。下面是根据给定的文件信息,生成的相关知识点: Liferay portal的安装与使用 Liferay portal的安装是实现门户解决...