Soru Birden çok parametreli JPA Kriteri API'sı


Birden fazla parametre ile JPA Ölçüt API'sini kullanan bir arama yöntemi yapmam gerekiyor. Şimdi sorun şu ki her parametre gerekli değil. Yani bazıları boş olabilir ve sorguya dahil edilmemelidir. Bunu CriteriaBuilder ile denedim ama nasıl çalıştığını göremedim.

Hazırda Kriterler API'sı ile bu oldukça kolaydır. Sadece kriterleri oluşturun ve ardından Kısıtlamalar ekleyin.

Criteria criteria = session.createCriteria(someClass.class);
if(someClass.getName() != null) {
   criteria.add(Restrictions.like("name", someClass.getName());
}

JPA'nın Kriter API'sı ile nasıl aynı şeyi yapabilirim?


25
2017-08-30 14:39


Menşei




Cevaplar:


Konsept dizisini oluşturmaktır javax.persistence.Predicate Sadece kullanmak istediğimiz yüklemeleri içerir:

Sorgulanacak örnek varlık:

@Entity
public class A {
    @Id private Long id;    
    String someAttribute;
    String someOtherAttribute;
    ...
}

Sorgu kendisi:

    //some parameters to your method
    String param1 = "1";
    String paramNull = null;

    CriteriaBuilder qb = em.getCriteriaBuilder();
    CriteriaQuery cq = qb.createQuery();
    Root<A> customer = cq.from(A.class);

    //Constructing list of parameters
    List<Predicate> predicates = new ArrayList<Predicate>();

    //Adding predicates in case of parameter not being null
    if (param1 != null) {
        predicates.add(
                qb.equal(customer.get("someAttribute"), param1));
    }
    if (paramNull != null) {
        predicates.add(
                qb.equal(customer.get("someOtherAttribute"), paramNull));
    }
    //query itself
    cq.select(customer)
            .where(predicates.toArray(new Predicate[]{}));
    //execute query and do something with result
    em.createQuery(cq).getResultList();

64
2017-08-30 15:04



Nasıl alırsın em örnek? - Alex
@Alex em, yani EntityManager, muhtemelen sadece otomatik olarak bağlanacaktır. Config sınıfınız bunu ayarlayacaktır. - Amrinder Arora


Bu siteye bir göz atın JPA Kriteri API'sı. Çok sayıda örnek var.

Güncelleme: Somut bir örnek vermek

Hesapları belirli bir değerden daha düşük bir bakiye ile arayalım:

SELECT a FROM Account a WHERE a.balance < :value

İlk önce bir Ölçüt Oluşturucu oluşturun

CriteriaBuilder builder = entityManager.getCriteriaBuilder();

CriteriaQuery<Account> accountQuery = builder.createQuery(Account.class);
Root<Account> accountRoot = accountQuery.from(Account.class);
ParameterExpression<Double> value = builder.parameter(Double.class);
accountQuery.select(accountRoot).where(builder.lt(accountRoot.get("balance"), value));

Sonuç almak için parametreleri (parametreleri) ayarlayın ve sorguyu çalıştırın:

TypedQuery<Account> query = entityManager.createQuery(accountQuery);
query.setParameter(value, 1234.5);
List<Account> results = query.getResultList();

BTW: entityManager bir EJB / Service / DAO'da bir yere enjekte edilir.


3
2017-08-30 14:50



Bir parametre ayarlamazsam, bu sorguda nasıl yansıtılır? Hala diğer parametrelerin CriteriaQuery'ye eklenmesi gerektiğinden. Ve bunlardan biri boşsa, bu beklenmedik sonuçlara yol açacaktır. - mokuril


Mikko'nun cevabı güzel çalıştı. Tek yapmam gereken değişiklik: Yerine:  cq.select (müşteri)             .where (predicates.toArray (yeni Predicate [] {})); İle değiştirildi: Predicate [] predicatesarr = predicates.toArray (yeni Predicate [predicates.size ()]); cq.select (müşteri) (predicatesarr) .Where;

Bir yerde orijinalden listeden diziye dönüştürme çalışmadı.


0
2017-10-10 05:16