5

sınıf Operation ve bunun 3 alt sınıfları düşünün.Alias ​​

Ben account özelliği sorgulamak istiyorum:

session.createCriteria(Operation.class) 
     .add(Restrictions.eq("account", account)) 
     .list(); 

Bu çalışır. Hazırda bekletme, Operation ve OpA öğelerinin account adlı hiçbir alana sahip olmadığını ve OpB ve OpC için doğru sonuçları döndürdüğünü göz ardı eder.

Ancak, şimdi hesap sahibinin hesap sorgusunu da sorgulamak istiyorum. Sonra account için takma _account oluşturun:

session.createCriteria(Operation.class) 
     .add(Restrictions.eq("account", account)) 
     .createAlias("account", "_account") 
     .add(Restrictions.eq("_account.owner", "John")) 
     .addOrder(Order.asc("_account.owner")) 
     .list(); 

Bu başarısız olur. Hazırda şikayet böylece (OpB ve OpC itibaren) hesap için 2 ayrı tablolar vardır:

Not unique table/alias: 'account1_' 

Benim sorum: Ben sadece Criteria (hayır SQL kullanarak, hesap ve hesap sahibi hem de sorgulayabilir nasıl HQL) en basit şekilde?

+0

Ne yapacağınız gibi istenen SQL görünüyor? –

+0

@Pedrag: Üzgünüm, hiçbir fikrim yok. – MarcG

cevap

3

Bu benim çözümümdür. Sadece kısmen çalışır: .addOrder(Order.asc("_account.owner")):

Criterion subQ1 = Subqueries.propertyIn("id", 
         DetachedCriteria.forClass(OpB.class) 
          .add(Restrictions.eq("account", account)) 
          .createAlias("account", "_account") 
          .add(Restrictions.eq("_account.owner", "John")) 
          .setProjection(Projections.groupProperty("id"))); 

Criterion subQ2 = Subqueries.propertyIn("id", 
         DetachedCriteria.forClass(OpC.class) 
          .add(Restrictions.eq("account", account)) 
          .createAlias("account", "_account") 
          .add(Restrictions.eq("_account.owner", "John")) 
          .setProjection(Projections.groupProperty("id"))); 

session.createCriteria(Operacao.class) 
     .add(Restrictions.disjunction() 
      .add(subQ1) 
      .add(subQ2)) 
     .list(); 

Bu sürece ben sırasını katmayan olarak çalışmaktadır.

Sipariş, hiçbir etkisi olmayacağı için Subqueries'a eklenemez. Ve diğer adı kabul etmediğinden, Criteria'a eklenemez.

Belki de bunu düzeltmenin bir yolu var, ya da belki bu çözüm çok karmaşık ve daha kolay bir tane var mı?

3

Aşağıdaki iki çözüm işe yaramıyor. Her ikisi de Not unique table/alias: 'account1_' ile sonuçlanır.

session.createCriteria(Operacao.class) 
     .add(Restrictions.eq("account", account)) 
     .createCriteria("account") 
     .add(Restrictions.eq("owner", "John")) 
     .list(); 
1

Dene: takma olmadan

session.createCriteria(Operation.class) 
     .createAlias("account", "_account") 
     .add(
      Restrictions.and(
       Restrictions.or(
        Property.forName("class").eq(OpB.class), 
        Property.forName("class").eq(OpC.class)), 
       Restrictions.eq("account", account) 
       Restrictions.eq("_account.owner", "John")) 
       ) 
      ) 
     .list(); 

:

Soruyu kendisi sorunlara neden olmadan, başkasına fikir vermek belki işe veya vermez neyi belgelemek için onları buraya ilanıyla Şimdi

public abstract class AccountOperation extends Operation { 
    public abstract Account getAccount();  
} 

hem: gibi bir AccountOperation soyut bir sınıf eklemek içinve OpC, AccountOperation'u genişletecektir.

Sorgunuzda olacak:

Criteria c = session.createCriteria(AccountOperation.class, "op") 
    .createAlias("op.account", "ac") 
    .add(Restrictions.eq("ac", account)) 
    .addOrder(Order.asc("ac.owner")) 
    .list(); 
+0

Evet, örneğim gereksizdir, ancak bu yalnızca bir örnektir. Benim sorunum 'Eşsiz tablo/takma ad: 'account1_'' istisnası. – MarcG

+0

Üzgünüm Vlad, ofisten çıkmıştım ve daha önce test edemedim. Peki, örneğiniz bana bu istisnayı veriyor: 'Eşsiz masa/takma adlar: 'ac1_''. – MarcG

+0

IN yönergesini kullanıyorum java.lang.Class java.lang.Integer '' org.hibernate.type.descriptor.java.IntegerTypeDescriptor.unwrap '' a dönüştürülemiyor. – MarcG

İlgili konular