如何在QueryDSL中选择文字

gen*_*qew 7 java orm hibernate querydsl

我目前正在开发一个使用queryDSL和hibernate的项目,其中需要一个select文字.按照这里发布的示例我有:

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

其中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)
Run Code Online (Sandbox Code Playgroud)

将此更改为:

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

产生不同的堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

我尝试将Foo类构造函数更改为接受Integer并将查询修改为使用Integer以便进行测试,它确实生成了正确的查询:

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

使用NumberTemplate选择BigDecimal文字的正确方法是什么?NumberTemplate docs指定T扩展Number和Comparable但在非Integer类型上失败.如何在querydsl中正确选择常量/文字?

Gui*_* F. 0

我遇到了类似的问题,并向 QueryDSL 的开发人员询问了这个问题。答案是:“这是 Hibernate 中的一个错误,我们无法/不会修复它”。您可能需要使用除 an 之外的其他东西Expressions.constant才能使其正常工作。

在我的代码中,它使用类似于以下的代码:

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