【问题标题】:Named Query Possibility命名查询可能性
【发布时间】:2015-02-16 18:56:45
【问题描述】:

我的客户表中有一个客户姓名、会员编号、国籍和其他一些字段,如果我从上述三个中得到一个值。我只需要编写一个命名查询来从我得到的值中获取客户表中的值。是否有可能通过命名查询而不使用 jpa 中的普通查询来做到这一点?...

 StringBuilder s=new StringBuilder();
 s.append("select c from customerdetail c where )
 if(customerName!=null)
 {
   s.append(" c.customerName = :customerName")
 }
else if(memberShipNumber!=null)
 {
   s.append(" c.memberShipNumber = :memberShipNumber")
 }
else if(nationality!=null)
 {
   s.append(" nationality = :nationality)
 }

在这里,我使用具有三个条件的同一张表。那么是否有可能只编写一个命名查询或任何其他静态查询来满足 jpa 中的所有三个条件?

【问题讨论】:

  • 您能否添加更多信息,例如 - 当前查询、面临的问题及其预期结果。
  • 什么?你能再解释一下吗?

标签: java jpa


【解决方案1】:

尝试阅读ObjectDB's manual on JPA Queries。它通过其自定义字段提供有关选择 JPA 实体和不同变体的信息。它具有以 JPQL 表示的查询示例,因此使用 Criteria。是的,您可以使用 JPQL 定义 namedQuery,然后再使用它。

【讨论】:

  • 感谢您的回复。但我需要在静态时间执行查询。那么有可能这样做吗?...
【解决方案2】:

命名查询是静态的,它们的范围是持久性上下文,它们不能在运行时更改。

以下是使用 Criteria API 根据条件添加参数的示例。

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<CustomerDetail> cq = cb.createQuery(CustomerDetail.class);
Metamodel m = em.getMetamodel();
EntityType<CustomerDetail> CustomerDetail_ = m.entity(CustomerDetail.class);
Root<CustomerDetail> detail = cq.from(CustomerDetail.class);

if(customerName != null)
cq.where(cb.equal(detail.get(CustomerDetail_.customerName), customerName));

if(memberShipNumber != null)
cq.where(cb.equal(detail.get(CustomerDetail_.memberShipNumber), memberShipNumber));

if(nationality != null)
cq.where(cb.equal(detail.get(CustomerDetail_.nationality), nationality));

cq.select(detail);
TypedQuery<CustomerDetail> q = em.createQuery(cq);
List<CustomerDetail> customerList= q.getResultList();

否则,您可以通过附加条件而不是命名查询来构建带有字符串的查询。

【讨论】:

    【解决方案3】:

    您可以将投影与 NamedQuery 一起使用,如果 MembershipNumber 是唯一的,则此示例将获取单个 customerName 字段,或者每个 customerName 都与 where 条件匹配的 List:

    @Entity
    @NamedQuery(name="getCustomerName", query="SELECT c.customerName FROM Customer c WHERE c.membershipNumber = :memNum")
    public class Customer {
    ...
    }
    

    然后你可以调用它:(em 是你的EntityManager)

    String customerName = em.createNamedQuery("getCustomerName")
    .setParameter("memNum", myMembershipNumber)
    .getSingleResult();
    

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 2012-04-04
      • 2018-09-29
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多