如何从我的liferay自定义portlet中使用自定义mysql查询?

时间:2012-12-13 07:16:01

标签: mysql liferay portlet liferay-6 liferay-ide

我正在使用Liferay并开发我的自定义portlet,现在我想使用自定义查询从连接等多个表中检索一些数据。

我已经搜索了我的问题,但找不到理解分步过程的简单方法。

因此,如果有人可以指导我或给我任何教程来为我的自定义portlet创建自定义SQL查询。

在第4步之后,我已经在eclipse中构建了我的服务,并且它显示成功。在服务/持久性包中创建了两个文件,其名称为AdvertiseFinder.javaAdvertiseFinderUtil.java但是当我尝试访问时方法getAd_DisplayforReportsadvertiseFinderUtil.getAd_DisplayforReports("Any arguement with string") 它给了我错误,在AdvertiseFinderUtil中没有这样的方法

我在更新了我的AdvertiseFinderImpl方法后构建了服务。但是它没有工作

这是我的AdvertiseFinderImpl类

package emenu.advertise.database.service.persistence;

import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;

import emenu.advertise.database.model.ad_display;
import emenu.advertise.database.model.advertise;
import emenu.advertise.database.model.impl.ad_displayImpl;

import java.util.List;


import com.liferay.portal.SystemException;
import com.liferay.portal.kernel.dao.orm.QueryPos;
import com.liferay.portal.kernel.dao.orm.SQLQuery;
import com.liferay.portal.kernel.dao.orm.Session;
import com.liferay.util.dao.orm.CustomSQLUtil;

public class AdvertiseFinderImpl  extends BasePersistenceImpl<ad_display> implements advertiseFinder{

    public void getall() {
    }

    // the name of the query
        public static String GET_ADVERTISE = AdvertiseFinderImpl.class.getName()
                + ".getAdvertise";

        // the method which will be called from the ServiceImpl class
        public List<ad_display> getAd_DisplayforReports(String pattern) throws SystemException {

            Session session = null;
            try {
                // open a new hibernate session
                session = openSession();

                // pull out our query from book.xml, created earlier
                String sql = CustomSQLUtil.get(GET_ADVERTISE);

                // create a SQLQuery object
                SQLQuery q = session.createSQLQuery(sql);

                // replace the "Book" in the query string with the fully qualified java class
                // this has to be the hibernate table name
                q.addEntity("a_ad_display", ad_displayImpl.class);


                // Get query position instance
                QueryPos qPos = QueryPos.getInstance(q);

                // fill in the "?" value of the custom query
                // this is same like forming a prepared statement
                qPos.add(pattern);

                // execute the query and return a list from the db
                return (List<ad_display>)q.list();

                /*
                 // use this block if you want to return the no. of rows (count)

                 int rows = 0;

                 Iterator<Long> itr = q.list().iterator();

                 if (itr.hasNext()) { Long count = itr.next();

                 if (count != null) { rows = count.intValue(); } }

                 return rows;
                 */
            } catch (Exception e) {
                throw new SystemException(e);
            } finally {
                closeSession(session);
            }
        }

}

我的default-ext.xml跟随

<?xml version="1.0"?>

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

我的emenu.xml在这里

<custom-sql>
    <sql id="emenu.advertise.database.service.persistence.AdvertiseFinderImpl.getAd_DisplayforReports">
      <![CDATA[
            SELECT
                    *
            FROM
                a_ad_display
        ]]>
    </sql>
</custom-sql>

2 个答案:

答案 0 :(得分:1)

变化

return (List<ad_display>)q.list();

return (List<ad_display>) QueryUtil.list(q, getDialect(), -1, -1);

答案 1 :(得分:1)

以下是在Liferay中编写自定义查询/查找程序方法的步骤:

  1. 在/ generated / service / persistence目录中创建一个名为EntityFinderImpl.java的新查找程序。
  2. &#39;建立服务&#39;关于这个项目。
  3. ServiceBuilder自动生成以下两个额外文件:EntityFinder.java和EntityFinderUtil.java
  4. 现在打开EntityFinderImpl.java文件,让这个类扩展BasePersistenceImpl并实现EntityFinder。 (假设实体(表名)在service.xml中定义,其他必需的类也由ServiceBuilder自动生成)
  5. 现在将所需的自定义方法添加到EntityFinderImpl.java并再次构建服务以将此方法分发给Util类。
  6. 可以使用liferay的DynamicQuery API或SQL查询创建自定义方法,如下所示:

    public List<Entity> getCustomDataFromFinder("Parameters") throws SystemException {
    
        Session session = null;
        StringBuilder queryString = new StringBuilder();    
        Entity e = new EntityImpl();
    
        try {
            session = openSession();
    
            queryString.append(" Write your Query here and conditionally append parameter value(s).");
    
            SQLQuery query = session.createSQLQuery(queryString.toString());
                     query.addEntity("EntityName", EntityImpl.class);           
    
            return (List<Entity>) QueryUtil.list(query, getDialect(), 0, -1);
        } 
        catch (Exception e) {
            throw new SystemException(e);
        }       
        finally {
            if (session != null) {
                closeSession(session);
            }
        }
    }