0

customer テーブルに customerName、MembershipNumber、nationality などのフィールドがあり、上記の 3 つの値から 1 つの値を取得した場合。取得した値から Customer テーブルの値を取得するには、名前付きクエリを 1 つだけ作成する必要があります。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)
 }

ここでは、3 つの条件で同じテーブルを使用します。jpaの3つの条件すべてを満たすために、名前付きクエリまたは他の静的クエリを1つだけ作成する可能性はありますか?

4

3 に答える 3

1

JPA クエリに関する ObjectDB のマニュアルを読んでみてください。カスタム フィールドを使用して、JPA エンティティとさまざまなバリエーションの選択に関する情報を提供します。Criteria を使用して JPQL で表現されたクエリの例があります。はい、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 フィールドを取得するか、where 条件に一致するすべての customerName を含むリストを取得します。

@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 に答える