Hiện tại, tôi đang làm việc trên một dự án sử dụng queryDSL và hibernate trong đó nó yêu cầu một chữ được chọn. Sau các ví dụ posted here tôi có:Cách chọn chữ trong QueryDSL
createQuery().
from(path()).
where(specification().getPredicate()).
list(
ConstructorExpression.create(Foo.class, Expressions.constant(BigDecimal.ONE)));
nơi Foo lớp có một constructor mà chấp nhận một BigDecimal. Khi chạy này trong kiểm tra, tôi nhận được
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)
thay đổi này để:
createQuery()
.from(path()).
where(specification().getPredicate())
.list(
ConstructorExpression.create(Foo.class, NumberTemplate.create(BigDecimal.class, "1.0")));
tạo ra một stacktrace khác nhau:
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)
tôi đã cố gắng thay đổi lớp constructor Foo chấp nhận Integer và truy vấn được sửa đổi để sử dụng Integer cũng như vì mục đích thử nghiệm và nó đã tạo ra truy vấn chính xác:
createQuery()
.from(path()).
where(specification().getPredicate())
.list(ConstructorExpression.create(LevelBoundary.class, NumberTemplate.create(Integer.class, "1")));
Đang sử dụng NumberTemplate đúng cách để chọn chữ lớn BigDecimal? Các tài liệu NumberTemplate chỉ định T mở rộng Number và Comparable nhưng không thành công trên các kiểu không Integer. Làm thế nào để tôi chọn đúng hằng số/literals trong querydsl?
tôi đã cùng một ngoại lệ và cũng giải quyết nó bằng cách sử dụng NumberTemplate.create (Long.class, "1") thay vì Expressions.constant (1L) – Stephane
Tuyên bố đầy đủ của tôi: 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 Danh sách resultList = query.distinct(). Danh sách (qRolloutMeta); –
Stephane
Hi Stephane, tôi có thể xác nhận rằng điều này thực sự làm việc cho số nguyên hoặc loại Long hoạt động nhưng không cho BigDecimal (mẫu trên khối thứ 3 của mã OP) – geneqew