【问题标题】:can you parameterized where clause in jpql你能参数化 jpql 中的 where 子句吗
【发布时间】:2016-03-30 06:16:38
【问题描述】:

我对 JPQL 不是很熟悉,但我知道您可以通过执行以下操作来参数化条件:

 em.createQuery("SELECT p FROM Person p WHERE p.firstName = :name)
               .setParameter("name","Bill");

或者:

em.createQuery("SELECT p FROM Person p WHERE p.firstName= ?1)
              .setParameter(1,"Bill");

但是你能参数化别的东西吗?通过参数化 WHERE 子句来说出标准。例如,您可以执行以下操作:

em.createQuery("SELECT p FROM Person p WHERE :criteria = Bill)
                   .setParameter("criteria","p.lastName");

我测试了上面的代码,但它不起作用,所以我的问题是:有没有办法在 JPQL 中参数化 WHERE 子句。或者是否有任何其他查询语言支持 WHERE 子句参数化?非常感谢!

【问题讨论】:

  • 你能用Criteria API吗?
  • 不,不使用 JPQL。没有意义。使用标准
  • 我检查了 Criteria API,但没有发现任何有用的东西...谢谢!

标签: mysql jpa jpql


【解决方案1】:

试试这个

TypedQuery<Person> query = em.createQuery("SELECT p FROM Person p WHERE p.lastName = :lastName", Person.class);
query.setParameter("lastname", "Bill");

如果你想添加更多参数,那么

TypedQuery<Person> query = em.createQuery("SELECT p FROM Person p WHERE p.lastName = :lastName AND p.firstName = :firstName", Person.class);
query.setParameter("lastName", "Bill");
query.setParameter("firstName", "Jack");

一旦创建查询,您就可以使用

query.getResultList();

如果您期待多个结果

query.getSingleResult();

如果您只期望一个结果(例如按主键或唯一列查询)

更多信息,请参考TypedQuery

回答cmets的问题:

一个。要么拥有三个查询,要么根据他们在 UI 中选择的内容使用查询

String query;
if (isFirstName) {
    query = "SELECT p FROM Person p WHERE p.firstName = :searchCriteria"
} else if (isMiddleName) {
    query = "SELECT p FROM Person p WHERE p.middleName = :searchCriteria"
} else {
    query = "SELECT p FROM Person p WHERE p.lastName = :searchCriteria"
}
TypedQuery < Person > query = em.createQuery(query, Person.class);
query.setParameter("searchCriteria", "Bill");

b.更改搜索:

String searchCriteria = "p.lastName";
TypedQuery<Person> query = em.createQuery(("SELECT p FROM Person p WHERE " + searchCriteria + " = :name"), Person.class);
query.setParameter("name", "Bill");

*对于字符串比较,也可以使用LIKE

【讨论】:

  • 哦,我的意思是我想改变搜索的条件,即 WHERE 子句之后的语句......在你的例子中,你仍然需要在运行时之前设置 WHERE 子句。不过还是谢谢!
  • @ODStreet 我不太确定我是否理解您要查找的内容。在 WHERE 之后,例如 ORDER BY 和 LIMIT?您能否提供您正在寻找的示例或伪代码
  • 标准,根据我的定义,是您要设置条件的类别。例如,一个人可以有 firstName、lastName、middleName,这些都是标准。现在我想根据名为“Bill”的人获取 List,但是这个“Bill”是 firstName、lastName 还是 middleName 由运行时的用户决定。所以我必须编写一个类似“SELECT p FROM Person p WHERE :xxName=Bill”的查询。在此示例中,xxName 将替换为 usrs 提供的 p.firstName/p.lastName/p.middleName。我的问题中有一个伪代码。谢谢!
  • 我更新了答案,希望对您的需求有所帮助
  • 谢谢!似乎没有用于实现此标准参数化的开箱即用 API。因此,您的方式将成为此时的解决方案之一。我会把你的作为答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多