使用“in”在 Play Framework 1.x / JPA 中构建查询的更简单方法?

Posted

技术标签:

【中文标题】使用“in”在 Play Framework 1.x / JPA 中构建查询的更简单方法?【英文标题】:An easier way to build queries in Play Framework 1.x / JPA using "in"? 【发布时间】: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());

【问题讨论】:

【参考方案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:对,抱歉,一开始没注意到“?”……无论如何,很高兴你能以这种方式工作。

以上是关于使用“in”在 Play Framework 1.x / JPA 中构建查询的更简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework:使用 H2 内存数据库获取序列 nextval 时出错

无法访问 H2 in-mem 数据库 Play!框架

如何在 Play Framework 2.0 中使用相对路径访问资源文件?

如何使用 Play Framework 显示 SQL?

使用 play framework 1.+ 指定图像名称(使用 play.db.jpa.blob)

如何在 Play Framework 1.2 中实现 HTTP Basic Auth?