2012-04-04 80 views
0

我有我的客户表中的customerName,MembershipNumber,国籍和一些其他字段的字段,如果我从上述三个获得一个值。我只需要编写一个命名查询来从我得到的值中获取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中的所有三个条件?

+0

您可以添加更多信息 - 当前查询,面临的问题和预期的结果。 – 2012-04-04 09:51:55

+0

什么?你能再解释一下吗? – arg20 2012-04-04 11:21:54

回答

1

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

+0

感谢您的回复。但我需要查询在静态时间执行。所以这样做的可能性?... – user1227591 2012-04-04 10:40:09

0

您可以使用投影与NamedQuery,这个例子将获得单一客户名称字段,如果MembershipNumber是唯一的或与每一个符合WHERE条件客户名称的列表:

@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(); 
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(); 

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