2014-10-07 25 views
7

Şu anda selectDSral'ı gerektiren bir arama sorgusu olan ve bir hazır bilgi kaynağı olan bir projede çalışıyorum. örnekler here yayınlanmıştır takiben i vardır:QueryDSL'deki hazır şablonları seçme

Foo sınıfı BigDecimal kabul eden bir kurucu sahip
createQuery(). 
    from(path()). 
     where(specification().getPredicate()). 
      list(
    ConstructorExpression.create(Foo.class, Expressions.constant(BigDecimal.ONE))); 

. testinde bu çalıştırırken, ben bu değişen

org.hibernate.QueryException: Parameters are only supported in SELECT clauses when used as part of a INSERT INTO DML statement 
    at org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:146) 

olsun:

createQuery() 
    .from(path()). 
     where(specification().getPredicate()) 
      .list(
ConstructorExpression.create(Foo.class, NumberTemplate.create(BigDecimal.class, "1.0"))); 

farklı stacktrace üretir:

java.lang.IllegalArgumentException: argument type mismatch 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.mysema.query.types.ConstructorExpression.newInstance(ConstructorExpression.java:133) 
    at com.mysema.query.jpa.FactoryExpressionTransformer.transformTuple(FactoryExpressionTransformer.java:50) 

Ben Tamsayı kabul etmek Foo sınıfı yapıcısı değişen çalıştı ve Sorgu, sınama için de tamsayı kullanmak için değiştirildi ve doğru sorguyu verdi:

createQuery() 
    .from(path()). 
     where(specification().getPredicate()) 
     .list(ConstructorExpression.create(LevelBoundary.class, NumberTemplate.create(Integer.class, "1"))); 

NumberTemplate kullanarak BigDecimal literals seçmek için doğru yolu? NumberTemplate belgeleri, T genişletme Numarası ve Karşılaştırılabilir'i belirtir, ancak Tam olmayan türlerde başarısız olur. Queryds'ta sabitleri/değişmezleri nasıl düzgün seçerim?

+0

: Benim kod

, bu benzer bir kod ile çalışır Expressions.constant (1L) – Stephane

+0

Tüm ifadem: QRolloutMeta qRolloutMeta = yeni QRolloutMeta (qRollout, NumberTemplate.create (Long.class, qBTS.count(). ToString()), NumberTemplate.create (Integer.class, btsNbPlanned.toString ()), NumberTemplate.create (Integer.class, btsNbCompleted.toString()), NumberTemplate.create (Integer.class, btsPercentage.toString())); \t \t Liste sonuçList = query.distinct() liste (qRolloutMeta); – Stephane

+0

Merhaba Stephane, Bunun gerçekten tamsayı veya Uzun tip çalışmalar için çalıştığını ancak BigDecimal için değil (OP kodunun 3. bloğundaki örnek) – geneqew

cevap

0

Benzer bir sorun yaşadım ve bir QueryDSL geliştiricisi hakkında soru sordum. Cevap: "Hazırda bekletme hatası var, düzeltemeyiz/düzeltmeyeceğiz". Çalışması için Expressions.constant'dan başka bir şey kullanmanız gerekebilir. yerine aynı durum vardı ve ayrıca ("1", Long.class) NumberTemplate.create kullanarak münhal

ConstructorExpression.create(LevelBoundary.class, Expressions.stringTemplate("'1'")