2014-10-07 15 views
7

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?

+0

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

+0

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

+0

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

Trả lời

0

Tôi đã gặp sự cố tương tự và đã hỏi nhà phát triển QueryDSL về nó. câu trả lời là: "Đó là lỗi trong Hibernate, chúng tôi không thể/sẽ không sửa lỗi". Bạn có thể phải sử dụng một cái gì đó khác hơn là một Expressions.constant để làm cho nó hoạt động.

Trong mã của tôi, nó hoạt động với một mã tương tự như sau:

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

Các vấn đề liên quan