【问题标题】:Liferay custom-sql using IN operator使用 IN 运算符的 Liferay 自定义 sql
【发布时间】:2012-05-30 22:55:17
【问题描述】:

我正在使用 Liferay 6.1、Tomcat 和 MySQL。我有一个用于列表 portlet 的 custom-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 是一个有效的运算符吗?如果没有,如何在不同的组中搜索?

【问题讨论】:

  • 嗯,JDBC PreparedStatement(Liferay 可能在内部使用)不支持为 IN 子句传入数组。可能是因为这个。检查 QueryPos 对象是否提供任何 API 来执行此操作。

标签: liferay


【解决方案1】:

也许 hibernate 引用了您的 groupIds 字符串(大概是 "1,2,3,4" 的形式,当 hibernate 将其转换为 sql 时,它会为您加上引号?

您可能想尝试这样的事情(来自 Liferay 本身):

String sql = CustomSQLUtil.get(FIND_BY_C_C);

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

并在您的 SQL 中包含 ([$GROUP_IDS$]) 代替 (?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多