java - 如何在 QueryDSL 中选择文字

标签 java hibernate orm querydsl

我目前正在从事一个使用 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 但在非 Integer 类型上失败。我如何在 querydsl 中正确选择常量/文字?

最佳答案

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

在我的代码中,它使用与此类似的代码:

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

关于java - 如何在 QueryDSL 中选择文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26234067/

相关文章:

hibernate - hibernate : HQL Case Insensitive search

hibernate - HibernateSystemException:无法从Grails中的类[java.lang.Long]解析实体名称

java - 我们如何在 Hibernate 中按日期对结果进行排序?

java - JPA 继承 IdClass

java - hibernate 中的一级缓存存储在哪里?在内存还是硬盘?

java - 无法解析符号org.springframework.test.web.server

java - 如何从祖父类调用方法?

java - 处理括号语法

mysql - 有没有办法在多对一关系中共享类的复合主键?

java - 如何使用 Jclouds 1.7 访问 native 提供程序 API