Как правильно привести строку к числу с помощью API критериев JPA2? - PullRequest
4 голосов
/ 22 февраля 2012

Я пытаюсь написать запрос с подвыбором, где строка приводится к длинному.Возможно, я что-то упустил?

Запрос выглядит так:

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 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

Ответы [ 3 ]

4 голосов
/ 18 марта 2012

В Criteria API нет метода, который выполнял бы преобразование из String в Long.

Вы пытаетесь использовать метод как в Выражение , чтобы выполнить это преобразование. Javadoc объясняет, почему возникают проблемы во время выполнения:

Выполните приведение типа к выражению, возвращая новый объект выражения.Этот метод не вызывает преобразование типов: тип среды выполнения не изменяется.Предупреждение: может привести к сбою во время выполнения.

CriteriaBuilder имеет набор методов для преобразования типов, но также не поддерживает преобразование строки в число.

2 голосов
/ 04 февраля 2019

Приведенный ниже метод помог мне набрать тип String для других типов данных с помощью CriteriaBuilder

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, но решение варьируется в зависимости от базы данных

0 голосов
/ 22 июля 2016

Приведение типов может быть выполнено CriteriaBuilder.

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

См. Также ответ на вопрос StackOverflow 23728108

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...