2011-10-19 31 views
10

senin bir SQLProjection içinde kök kişiye atfen {alias} kullanabilirsiniz farkındayım:Referans dış kriterler bir SQLProjection içinden takma ad sorgulamak

Projections.sqlProjection("MIN({alias}.field) as value", new String[]{"value"}, new Type[]{new LongType()})) 

Ne yapmaya çalışıyorum bir için bir takma ad başvurmak için kök olmayan işletme: i dış kriterler terimi bir takma

Projections.sqlProjection("MIN(i.powerRestarts) as value", new String[]{"value"}, new Type[]{new LongType()})) 

. Yukarıdaki kod, i.powerRestarts'un bulunamadığını söyleyen bir SQL istisnası atar.

bir SQLProjection olmayan bir kök takma başvurmak mümkün mü?

cevap

12

Bazı googling yaptıktan sonra, bunun mümkün olmadığı anlaşılıyor - Hazırda bekletme, yalnızca {alias} kullanarak SQLProjection numaralı SQL dizesinde kök varlık takma adının eklenmesine izin verir. Ancak, Hibernate JIRA sayfalarında this issue regarding the limitation'u buldum.

Birisi, RestrictionsExt sınıfında yeni bir RestrictionsExt sınıfı aracılığıyla SQLProjection dizesinde kök olmayan takma adların kullanılmasına izin veren bir düzeltme eki gönderdi. Ben sütun takma adı için tip belirlenmesine izin vermek için statik RestrictionsExt.sqlProjection yöntemini değiştirmek zorunda

RestrictionsExt.sqlProjection("MIN({i}.powerRestarts) as value", "value", new LongType()) 

("value": Söz benim örneği kullanarak: olarak

Projections.sqlProjection("MIN(i.powerRestarts) as value", new String[]{"value"}, new Type[]{new LongType()})) 

takma i şimdi başvurulabilir yama buna izin ve StringType varsayılan ayarı vermedi gibi) (burada) LongType olarak tanımlanır.

Düzeltme ekindeki SQLAliasedProjection sınıfı ayrıca aşağıdaki özel yöntemlere org.hibernate.loader.criteria.CriteriaQueryTranslator: getOuterQueryTranslator ve getAliasedCriteria numaralı telefonlardan erişilmesini gerektirir.

cri = ((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery).getAliasedCriteria(alias); 

değiştirildi:

Method m = ((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery).getClass().getDeclaredMethod("getAliasedCriteria", String.class); 
m.setAccessible(true); 
cri = (Criteria) m.invoke(((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery), alias); 

Umarım bu aynı sorunla karşı karşıya başkasının yardımcı olacak bu hazırda kaynağını değiştirmeden çalışmasını sağlamak için, ben yansıma kullandı.

İlgili konular