Вопрос по – Liferay custom-sql с использованием оператора IN

4

Я использую Liferay 6.1, Tomcat и MySQL. У меня есть пользовательское предложение SQL для портлета списка. Custom-sql использует два параметра: массив groupIds и предел результата.

SELECT
count(articleId) as count,
...
FROM comments
WHERE groupId IN (?)
GROUP BY articleId
ORDER BY count DESC 
LIMIT 0, ?

Мой класс FinderImpl имеет этот метод:

 public List<Comment> findByMostCommented(String groupIds, long maxItems) {

    Session session = null;
    session = openSession();

    String sql = CustomSQLUtil.get(FIND_MOST_COMMENTS);

    SQLQuery query = session.createSQLQuery(sql);
    query.addEntity("Comment", CommentImpl.class);

    QueryPos queryPos = QueryPos.getInstance(query);
    queryPos.add(groupIds);
    queryPos.add(maxItems);

    List<Comment> queryResult = query.list();

    return queryResult;
}

Это возвращает 0 результатов. Если я удалю WHERE IN (), это сработает.

Является ли IN действительным оператором? Если нет, то как искать в разных группах?

Ну, JDBCPreparedStatement (который Liferay может использовать внутри) не поддерживает передачу массивов дляIN оговорка Это может быть из-за этого. Проверьте, еслиQueryPos object предоставляет любой API для этого. adarshr

Ваш Ответ

1   ответ
9

она имеет вид"1,2,3,4" а когда hibernate переводит это в sql, он ставит для тебя кавычки?

Вы можете попробовать что-то вроде этого (из самой Liferay):

String sql = CustomSQLUtil.get(FIND_BY_C_C);

sql = StringUtil.replace(sql, "[$GROUP_IDS$]", groupIds);

И включить([$GROUP_IDS$]) вместо(?) в твоем SQL

Спасибо. Это решило мою проблему. Ursula
Но он уязвим для SQL-инъекций .. astrohome

Похожие вопросы