【问题标题】:An easier way to build queries in Play Framework 1.x / JPA using "in"?使用“in”在 Play Framework 1.x / JPA 中构建查询的更简单方法?
【发布时间】:2012-08-08 17:07:28
【问题描述】:

Play 框架/JPA 中是否有快捷方式来节省手动构建此查询?

public List<User> getAllExceptThese(Collection<String> emails) {
    checkArgument(!emails.isEmpty());

    StringBuilder query = new StringBuilder("email not in (");
    boolean first = true;
    for (String email : emails) {
        if (!first) {
            query.append(", ");
        }
        first = false;
        query.append("?");
    }
    query.append(")");

    return findAll(query.toString(), emails.toArray());
}

【问题讨论】:

    标签: java jpa playframework playframework-1.x


    【解决方案1】:

    我不了解 Play-framework,但如果可以创建 JPQL 查询,那么构建一个 Query-object 并使用它来插入集合怎么样...

      public List<User> getAllExceptThese(Collection<String> emails) {
                checkArgument(!emails.isEmpty());
    
                String queryStr = "FROM User u WHERE u.email NOT IN (:excludedEmails)";
    
                Query query = entityManager.createQuery(queryStr);
                query.setParameter("excludedEmails", emails);
                return (List<User>)query.getResultList();
      }
    

    【讨论】:

    • 是否支持将集合作为查询参数传递?
    • @ripper234:是的。我使用 Hibernate 作为 JPA 提供程序,并且在命名参数中使用集合从来没有遇到过问题(只要操作员可以获取参数列表,如 IN)。作为一个额外的好处,setParameter 将保护您免受通过集合内的恶意值进行 SQL 注入。
    • 我构建查询的方法仍然可以防止 SQL 注入...我正在使用命名参数。
    • @ripper234:对,抱歉,一开始没注意到“?”……无论如何,很高兴你能以这种方式工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多