jpa - 如何使用 JPA2 Criteria API 将字符串正确转换为数字?

标签 jpa jpa-2.0 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_.latedToId a 是需要转换为 Long 的字符串。

但是底层 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-Final

最佳答案

下面的方法适用于我使用 CriteriaBuilder 将 String 类型转换为其他数据类型

CriteriaBuilder queryBuilder = em.getCriteriaBuilder();
Expression roomIdInt = queryBuilder.desc(root.get("room").get("id")).as(Integer.class));
//Expression roomIdInt = queryBuilder.desc(root.get("room").get("id")).as(Long.class));
//Expression roomIdInt = queryBuilder.desc(root.get("room").get("id")).as(Double.class));
//Expression roomIdInt = queryBuilder.desc(root.get("room").get("id")).as(Date.class));
//Expression roomIdInt = queryBuilder.desc(root.get("room").get("id")).as(Boolean.class));

最初,我在使用 CriteriaBuilder 时遇到了许多错误,并尝试检查数据库日志以检查正在执行的查询。这有助于根据需要纠正 HQL。上述方法在 PostgreSQL 中运行良好,但解决方案因数据库而异

关于jpa - 如何使用 JPA2 Criteria API 将字符串正确转换为数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9394176/

相关文章:

jpa - 在 JPA 中重写查询

jpa-2.0 - 使用 JAXB 进行灵活编码

hibernate - 正确使用JPA标准API,谓词以及CriteriaQuery的where方法

hibernate - 将 Hibernate 条件查询转换为 JPA 2 条件查询

java - hibernate 与 ProjectionList 错误 : cannot be cast to [Ljava. lang.Object;

java - ClassNotFoundException 编码(marshal)处理 EJB 参数

java - 使用 Spring Data 和 HIbernate JPA 进行延迟加载

java - 当没有要求时,Hibernate ManyToOne 总是级联

java - 过滤子类的 JPA CriteriaBuilder 方法是什么?

java - Hibernate Map ID 自动从字段中获取