2012-04-04 79 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(); 

否則,您可以通過附加條件而不是命名查詢來使用字符串構建查詢。