使用“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 时出错
如何在 Play Framework 2.0 中使用相对路径访问资源文件?