【问题标题】:Different results between ebean and manually entered SQL query?ebean和手动输入的SQL查询结果不同?
【发布时间】:2013-05-06 13:09:14
【问题描述】:

我已经构建了一个 MySQL 查询,当我通过 phpMyAdmin 尝试它时返回 452 个条目,这是查询:

SELECT csp.id FROM child_subscription_prices csp 
JOIN child_moments cm ON csp.child_moment_id = cm.id 
JOIN moments m ON cm.moment_id = m.id 
JOIN poles p ON m.pole_id = p.id 
JOIN persons pr ON pr.id = csp.payer_id 
WHERE cm.day BETWEEN '2013-1-15' AND '2013-1-17' AND p.type_id IN (1,2,3) AND csp.center_id = 1 
ORDER BY pr.lastname ASC

但是当我使用 Ebean (Play!Framework 2.1.1) 调用它时,像这样:

SimpleDateFormat format = new SimpleDateFormat("y-M-d");
StringBuilder querySql = new StringBuilder();
querySql.append("SELECT csp.id FROM child_subscription_prices csp ");
querySql.append("JOIN child_moments cm ON csp.child_moment_id = cm.id ");
querySql.append("JOIN moments m ON cm.moment_id = m.id ");
querySql.append("JOIN poles p ON m.pole_id = p.id ");
querySql.append("JOIN persons pr ON pr.id = csp.payer_id ");
querySql.append("WHERE cm.day BETWEEN :start AND :end AND p.type_id IN (:poles) AND csp.center_id = :center ");
querySql.append("ORDER BY pr.lastname ASC;");       

SqlQuery query = Ebean.createSqlQuery(querySql.toString());
query.setParameter("start", format.format(start));
query.setParameter("end", format.format(end));
query.setParameter("poles", StringUtils.join(poleIds.toArray(), ","));
query.setParameter("center", Session.getCenter().getId());

List<SqlRow> rows = query.findList();
rows.size(); // Return 409 !!

当然,我用Java测试了参数并比较了它们,它们是相同的! (我什至更新了我的第一个查询以匹配日期(2013-01-15 => 2013-1-15,就像用 Java 制作的一样!

我不知道为什么我使用 Java 的条目少了 50 个,是否有特定的 Ebean 配置因任何原因不遵循某些相关数据库,或者类似的东西可以解释差异?

更新

我还尝试计算用 Java 生成的 SQL 查询的结果数:

querySql.append("SELECT COUNT(csp.id) as total FROM child_subscription_prices csp ");
// ...

query.findUnique().getLong("total"); // Also 409 !

所以显然PhpMyAdmin和EBean中的配置好像有区别,但是看不出是哪一个!

【问题讨论】:

    标签: playframework-2.1 ebean


    【解决方案1】:

    有关信息,问题出在这一行:

    query.setParameter("poles", StringUtils.join(poleIds.toArray(), ","));
    

    相反,我只需要将其替换为:

    // poleids is a List<Long>
    query.setParameter("poles", poleIds);
    

    一切都很好:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 2016-02-08
      • 1970-01-01
      • 2015-09-08
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多