如何在QueryDSL中选择文字 [英] How To Select literals in QueryDSL

查看:522
本文介绍了如何在QueryDSL中选择文字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在使用queryDSL和hibernate的项目,其中它需要选择文字。遵循这里的示例,我拥有:

  createQuery()。 (路径())

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

其中Foo类有一个接受BigDecimal的构造函数。
当在测试中运行时,我得到

  org.hibernate.QueryException:仅当SELECT子句中支持参数时用作INSERT INTO DML语句的一部分
在org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:146)

更改为:

  createQuery()
。从(路径())。
其中(specification()。getPredicate())
.list(
ConstructorExpression.create(Foo.class,NumberTemplate.create(BigDecimal.class,1.0)));

会产生不同的堆栈跟踪:

<$ p $ (Native方法)$ b $在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:在本地方法)
在Sun.reflect.NativeConstructorAccessorImpl.newInstance0(本地方法)
在Sun.reflect.NativeConstructorAccessorImpl.newInstance
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以进行测试,并确实生成了正确的查询: / p>

  createQuery()
.f ROM(路径())。
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 以外的其他东西来实现它。



在我的代码中,它使用类似于此的代码:
$ b

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

code>


Im currently working on a project that uses queryDSL and hibernate wherein it requires a select literal. Following the examples posted here i have:

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

where Foo class has a constructor which accepts a BigDecimal. When running this in test, i get

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)

changing this to:

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

produces a different stacktrace:

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)

I tried changing the Foo class constructor to accept Integer and the query modified to use Integer as well for the sake of testing and it did produces the correct query:

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

Is using NumberTemplate the correct way to select BigDecimal literals? The NumberTemplate docs specifies T extending Number and Comparable but fails on non Integer types. How do i properly select constants/literals in querydsl?

解决方案

I've had a similar problem, and asked a developer of QueryDSL about it. the answer was : "It's a bug in Hibernate, we can't / won't fix it". You may have to use something else than an Expressions.constant to get it to work.

In my code, it works with a code similar to this :

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

这篇关于如何在QueryDSL中选择文字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆