2012-02-22 44 views
2

我正在嘗試用一個字符串被強制轉換爲長的子查詢來編寫一個查詢。 我可能錯過了什麼?如何正確使用JPA2 Criteria API將字符串轉換爲數字?

查詢看起來像:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Task> query = cb.createQuery(Task.class); 

Root<Task> from = query.from(Task.class); 

Subquery<Long> subquery = query.subquery(Long.class); 
Root<EntityKeyword> fromKeyword = subquery.from(EntityKeyword.class); 
subquery.select(fromKeyword.get(EntityKeyword_.relatedToId).as(Long.class)); 
subquery.where(cb.like(fromKeyword.get(EntityKeyword_.keyword), term)); 

query.where(cb.in(from.get(ModelEntity_.id)).value(subquery)); 

EntityKeyword_.relatedToId一個是字符串,需要投龍。

但底層的Hibernate失敗例外:

Last cause: No data type for node: org.hibernate.hql.ast.tree.MethodNode 
\-[METHOD_CALL] MethodNode: '(' 
    +-[METHOD_NAME] IdentNode: 'cast' {originalText=cast} 
    \-[EXPR_LIST] SqlNode: 'exprList' 
     +-[DOT] DotNode: 'entitykeyw1_.keyword' {propertyName=keyword,dereferenceType=ALL,propertyPath=keyword,path=generatedAlias1.keyword,tableAlias=entitykeyw1_,className=l.i.s.m.s.EntityKeyword,classAlias=generatedAlias1} 
     | +-[ALIAS_REF] IdentNode: 'entitykeyw1_.id' {alias=generatedAlias1, className=l.i.s.m.s.EntityKeyword, tableAlias=entitykeyw1_} 
     | \-[IDENT] IdentNode: 'keyword' {originalText=keyword} 
     \-[IDENT] IdentNode: 'int8' {originalText=int8} 

不知道什麼是錯的。任何幫助表示讚賞。

我使用Hibernate 3.6.8決賽

回答

2

有一個在標準API沒有方法,執行從字符串轉換爲長。

您嘗試使用方法作爲表達式進行此轉換。 Javadoc解釋了爲什麼你最終有運行時的問題:

在表達進行類型轉換,返回一個新的表達式 對象。此方法不會導致類型轉換:運行時類型 不會更改。警告:可能會導致運行時失敗。

CriteriaBuilder確實有用於typecast的bunch of methods,但也不支持字符串到數字的轉換。

0

雖然類型轉換可以由CriteriaBuilder完成。

CriteriaBuilder queryBuilder = em.getCriteriaBuilder(); 
Expression roomIdStr = root.get("room").get("id"); 
Expression roomIdInt = queryBuilder.function("INT", Integer.class, roomId); 

查看答案也StackOverflow question 23728108

相關問題