Как использовать пользовательский запрос mysql из моего пользовательского портлета liferay?

Я использую Liferay и разрабатываю свой собственный портлет, теперь я хочу использовать собственный запрос для извлечения некоторых данных из нескольких таблиц с объединениями и т. д.

Я гуглил информацию о своей проблеме, но не могу найти простой способ понять пошаговую процедуру.

Поэтому, если кто-нибудь может направить меня или дать мне какое-либо руководство по созданию пользовательского SQL-запроса для моего пользовательского портлета.

после этого 4-го шага я создал свою службу в eclipse и успешно ее показал. В пакете службы/постоянства создано два файла с именами AdvertiseFinder.java и AdvertiseFinderUtil.java, но когда я пытаюсь получить доступ к методу getAd_DisplayforReports с помощью advertiseFinderUtil.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>

person User 1531343    schedule 13.12.2012    source источник
comment
Я могу найти много: 1) шаг за шагом, как вы 2) Другой шаг за шагом шаг, хотя и не так хорош в представлении, как первый.   -  person Prakash K    schedule 13.12.2012
comment
я Пракаш, я тоже это обнаружил. Но теперь проблема, с которой я столкнулся, заключается в том, что моя служба успешно построена после создания класса finderimpl в службе/постоянстве webinf/src, но интерфейс не генерируется. Пожалуйста, посмотрите мой обновленный вопрос   -  person User 1531343    schedule 13.12.2012
comment
см. мой обновленный вопрос, также дал мой фрагмент класса AdvertiseFinderImpl   -  person User 1531343    schedule 14.12.2012
comment
GET_ADVERTISE — ложь.   -  person Habib Zare    schedule 09.05.2013
comment
в файле emenu.xml. идентификатор sql - xx.getAd_DisplayforReports, но в классе поиска - xx.getAdvertise. они должны быть одинаковыми.   -  person Habib Zare    schedule 09.05.2013
comment
Имя интерфейса должно быть AdvertiseFinder, а не AdvertisingFinder в реализации AdvertisingFinder.   -  person Pritesh Shah    schedule 16.07.2013


Ответы (2)


изменять

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

to

return (List<ad_display>) QueryUtil.list(q, getDialect(), -1, -1);
person Habib Zare    schedule 12.07.2013

Ниже приведены шаги для написания пользовательских методов запроса/поиска в Liferay:

  1. Создайте новый поисковик с именем EntityFinderImpl.java в каталоге /generated/service/persistence.
  2. 'строительный сервис' на проекте.
  3. ServiceBuilder автоматически создает следующие два дополнительных файла: EntityFinder.java и EntityFinderUtil.java.
  4. Теперь откройте файл EntityFinderImpl.java и позвольте этому классу расширить BasePersistenceImpl и реализовать EntityFinder. (Предполагается, что объект (имя таблицы) определен в файле service.xml, а другие необходимые классы также автоматически генерируются ServiceBuilder)
  5. Теперь добавьте требуемый пользовательский метод в EntityFinderImpl.java и снова создайте службу, чтобы распространить этот метод на классы Util.

Пользовательский метод можно создать с помощью DynamicQuery API или SQL-запроса liferay следующим образом:

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);
        }
    }
}
person Parkash Kumar    schedule 07.12.2013