0

我的客户表中有一个 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 中的所有三个条件?

4

3 回答 3

1

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

于 2012-04-04T10:03:31.577 回答
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();

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

于 2012-04-06T15:53:25.587 回答
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();
于 2012-04-04T10:27:38.373 回答