【问题标题】:How To Select literals in QueryDSL如何在 QueryDSL 中选择文字
【发布时间】:2014-12-01 18:22:30
【问题描述】:

我目前正在开发一个使用 queryDSL 和 hibernate 的项目,其中它需要一个选择文字。按照here 发布的示例,我有:

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 并将查询修改为使用 Integer 以进行测试,它确实产生了正确的查询:

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

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

【问题讨论】:

  • 我遇到了同样的异常,也通过使用 NumberTemplate.create(Long.class, "1") 而不是 Expressions.constant(1L) 解决了它
  • 我的完整声明: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())); List resultList = query.distinct().list(qRolloutMeta);
  • 嗨 Stephane,我可以确认这确实适用于整数或 Long 类型,但不适用于 BigDecimal(OP 的第三个代码块上的示例)
  • 嗨,我想知道为什么我们不能使用 Expressions.constant() 形式...

标签: java hibernate orm querydsl


【解决方案1】:

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

在我的代码中,它适用于类似于此的代码:

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

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2019-12-30
    • 2020-02-09
    相关资源
    最近更新 更多