it-swarm-tr.com

Örnek ve Projeksiyonlara Göre Hazırda Bekletme Sorgulaması

Kısaltmak için: hazırda bekleme, projeksiyonları desteklemiyor ve örnek olarak sorgulamıyor mu? Bu yazıyı buldum:

Kod şudur:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr))

Diğer afişin dediği gibi, oluşturulan sql, sadece y0_ = 'a gönderme yapan bir where sınıfına sahip olmaya devam ediyor. this_.city yerine. 

Zaten birkaç yaklaşım denedim ve sorun izleyiciyi aradım ancak bu konuda hiçbir şey bulamadım.

Projection alias ve Transformers'ı kullanmayı bile denedim, ancak işe yaramadı:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr)).setResultTransformer(Transformers.aliasToBean(User.class));

Herhangi biri projeksiyonları ve sorguyu örnek olarak kullandı mı?

21
Miguel Ping

Kullanıcı sınıfınızı görebilir miyim? Bu sadece aşağıdaki kısıtlamaları kullanıyor. Kısıtlamaların neden Örneklerden gerçekten farklı olduğunu anlamıyorum (boş alanların örneklerde varsayılan olarak yoksayıldığını düşünüyorum).

getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Restrictions.eq("city", "TEST")))
.setResultTransformer(Transformers.aliasToBean(User.class))
.list();

AlaistToBean'ı hiç kullanmadım, ama sadece okudum. Ayrıca sadece sonuçları üzerinden döngü olabilir ..

List<Object> rows = criteria.list();
for(Object r: rows){
  Object[] row = (Object[]) r;
  Type t = ((<Type>) row[0]);
}

Gerekirse, Kullanıcıyı kendiniz bu şekilde kendiniz de doldurabilirsiniz.

Sorunu teşhis etmek için daha fazla bilgi olmadan soruna bakmak zor.

16
Arthur Thomas

Objects özelliğiyle aynı ada sahip bir takma adınız olduğunda sorun ortaya çıkıyor. Hazırda Bekletme, takma adı alır ve sql'de kullanır. Bunu here ve here belgesinde buldum ve Hibernate ekibinin kabul edeceğinden emin olmasam da, Hibernate'de bir hata olduğuna inanıyorum.

Her iki durumda da, benim durumumda bu işleri basit bir iş buldum. Kilometreniz değişebilir. Ayrıntılar aşağıda, bu örnek için kodu basitleştirmeye çalıştım, bu nedenle herhangi bir hata veya yazım hatası için özür dilerim:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Bu sql üretir misiniz:

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

Hataya neden olan: Java.sql.SQLException: ORA-00904: "Y1_": geçersiz tanımlayıcı

Ama, "this" kullanma kısıtlamamı değiştirdiğimde, şöyle:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Aşağıdaki sql üretti ve sorunum çözüldü.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

Bu kadar! Acı veren bir problem için oldukça basit bir düzeltme. Bu düzeltmenin örnek soruna göre sorguyu nasıl çevireceğini bilmiyorum, ama sizi daha da yaklaştırabilir.

44
Ryan Cook

Buradaki asıl sorun, kış uykusunda, nerede-yan tümcesinde select-list takma adlarını kullandığı yerde bir hata olmasıdır:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-817

Birisi cevapları bulmak için buraya gelirse, git biletine bak. Düzeltilmesi 5 yıl sürdü, ancak teoride, gelecek sürümlerden birinde olacak ve ardından sorununuzun çözüleceğinden şüpheleniyorum.

6
Dobes Vandermeer

Benzer bir problemle karşı karşıyayım. Query by Örnek kullanıyorum ve sonuçları özel bir alana göre sıralamak istiyorum. SQL'de şöyle bir şey yapardım:

select pageNo, abs(pageNo - 434) as diff
from relA
where year = 2009
order by diff

Sıfat yan tümcesi olmadan iyi çalışıyor. Benim sahip olduğum şey

Criteria crit = getSession().createCriteria(Entity.class);
crit.add(exampleObject);
ProjectionList pl = Projections.projectionList();
pl.add( Projections.property("id") );
pl.add(Projections.sqlProjection("abs(`pageNo`-"+pageNo+") as diff", new String[] {"diff"}, types ));
crit.setProjection(pl);

Ama ben eklediğimde 

crit.addOrder(Order.asc("diff"));

Bir org.hibernate.QueryException: özelliği çözemedi: diff exception. this ile yapılan geçici çözüm de çalışmıyor. 

Not: Hazırda Bekletme için QBE kullanımıyla ilgili ayrıntılı bir belge bulamadığım için yukarıdakilerin tümü esas olarak deneme yanılma yaklaşımı

0
VHristov
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("id"));
pl.add(Projections.sqlProjection("abs(`pageNo`-" + pageNo + ") as diff", new String[] {"diff"}, types ), diff); ---- solution
crit.addOrder(Order.asc("diff"));
crit.setProjection(pl);
0
singh