2014-10-07 7 views
7

में वर्तमान में एक प्रोजेक्ट पर काम करने के लिए क्वेरी जो मैं क्वेरीएसएल और हाइबरनेट का उपयोग करता हूं जिसमें इसे चुनिंदा शाब्दिक की आवश्यकता होती है। उदाहरण तैनात here के बाद मेरे पास है:QueryDSL

createQuery(). 
    from(path()). 
     where(specification().getPredicate()). 
      list(
    ConstructorExpression.create(Foo.class, Expressions.constant(BigDecimal.ONE))); 

जहां फू वर्ग एक निर्माता है जो एक BigDecimal स्वीकार करता है। जब परीक्षा में इस चल रहा है, मैं

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) 

प्राप्त करने के लिए इस बदलते:

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

एक अलग स्टैकट्रेस पैदा करता है:

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) 

मैं फू वर्ग निर्माता बदलते पूर्णांक स्वीकार करने के लिए कोशिश की और क्वेरी को परीक्षण के लिए इंटीजर का उपयोग करने के लिए संशोधित किया गया और यह सही क्वेरी उत्पन्न करता है:

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

बिगडिमेमल अक्षरों का चयन करने के लिए सही तरीके से नंबर टेम्पलेट का उपयोग कर रहा है? NumberTemplate दस्तावेज़ों में विस्तारित संख्या और तुलनात्मक टी निर्दिष्ट करता है लेकिन गैर इंटीजर प्रकारों पर विफल रहता है। मैं querydsl में स्थिरांक/अक्षर का सही तरीके से चयन कैसे करूं?

+0

मैं एक ही अपवाद था और यह भी NumberTemplate.create का उपयोग करके इसे हल (Long.class, "1"):

मेरे कोड में, यह इस के समान एक कोड के साथ काम करता Expressions.constant (1L) – Stephane

+0

मेरा पूरा विवरण: QRolloutMeta qRolloutMeta = new 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 सूची परिणाम सूची = query.distinct()। सूची (qRolloutMeta); – Stephane

+0

हाय स्टीफन, मैं पुष्टि कर सकता हूं कि यह वास्तव में पूर्णांक या लंबे प्रकार के कामों के लिए काम करता है लेकिन बिगडिसीमल (ओपी के कोड के तीसरे ब्लॉक पर नमूना) के लिए नहीं, – geneqew

उत्तर

0

मुझे एक ही समस्या है, और इसके बारे में QueryDSL के डेवलपर से पूछा। जवाब था: "यह हाइबरनेट में एक बग है, हम इसे ठीक नहीं कर सकते/नहीं करेंगे"। इसे काम करने के लिए आपको Expressions.constant से कुछ और उपयोग करना पड़ सकता है। बजाय

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

संबंधित मुद्दे