2014-10-07 56 views
7

我目前正在使用queryDSL和hibernate的项目,其中它需要选择文字。下面的例子中张贴here我有:如何在QueryDSL中选择文字

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

其中Foo类有它接受一个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) 

我试图改变Foo类的构造函数接受整数和为了测试而修改为使用Integer的查询并且它确实产生了正确的查询:

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

是使用NumberTemplate正确的方式来选择BigDecimal的文字? NumberTemplate文档指定T扩展Number和Comparable,但在非Integer类型上失败。我如何正确选择querydsl中的常量/文字?

+0

我有同样的异常,也可以通过使用NumberTemplate.create解决它(Long.class,“1”),而不是表达式.constant(1L) – Stephane 2014-10-28 06:27:07

+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列表 resultList = query.distinct()列表(qRolloutMeta)。 – Stephane 2014-10-28 06:52:07

+0

嗨Stephane,我可以证实,这确实适用于整型或长类型的作品,但不适用于BigDecimal(在OP代码的第三块样本) – geneqew 2014-10-28 11:59:52

回答

0

我有类似的问题,并询问QueryDSL的开发人员。答案是:“这是Hibernate中的一个错误,我们不能/不会修复它”。您可能不得不使用Expressions.constant以外的东西才能使其工作。

在我的代码,它与类似下面的代码工作:

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