命名查询可能性

时间:2012-04-04 09:38:39

标签: java jpa

我的客户表中有customerName,MembershipNumber,nationality和其他一些字段,如果我从上面三个中得到一个值。我只需要编写一个命名查询来从我得到的值中获取Customer表中的值。有没有可能通过命名查询来执行此操作而不使用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中的所有三个条件?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

以下是使用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();

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

答案 2 :(得分:0)

您可以对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();