Выражение api критериев с приведением

Я новичок в jpa, мне нужно что-то вроде этого:

TypedQuery<XXX> typedQuery = em.createQuery("select c from XXX c where cast(c.description as string) like :name", XXX.class);
typedQuery.setParameter("name", startStr + "%");

Я использую "cast", потому что c.description имеет необычный тип (введите "mvarchar" в патче postgresql для 1c). Это работает, но мне нужно использовать предикаты:

ParameterExpression<String> parameter = builder.parameter(String.class, "name");
predicate = builder.like(root.<String>get("description"), parameter);    
query.where(builder.and(predicate));            

"description" имеет тип String в классе сущности XXX.

Ошибка после выполнения: ОШИБКА: оператор не существует: символ mvarchar ~~ меняется

Я пробовал сделать "как" (root.get ("description"). As (String.class)), но результат тот же.

Могу я это исправить?


person Sergei Vatshekin    schedule 04.08.2013    source источник


Ответы (1)


Вы можете попробовать создать собственный диалект для регистрации типа mvarchar как nvarchar.

public class MyDialect extends PostgreSQLDialect {
    registerColumnType(Types.VARCHAR, 255, "mvarchar($l)");
}

Если таким образом вы заставляете Hibernate думать как столбец mvarchar как стандартный varchar.

person Luca Basso Ricci    schedule 04.08.2013
comment
У меня тот же результат, что и раньше: оператор не существует: mvarchar ~~ символ меняется - person Sergei Vatshekin; 04.08.2013
comment
Вы заменили в persistence.xml новый диалект? - person Luca Basso Ricci; 04.08.2013
comment
Да, я поменял диалект - person Sergei Vatshekin; 04.08.2013
comment
После изменений первого варианта (выберите c из XXX c, где cast (c.description как строка), например: name) дает мне ту же ошибку (меняется символ mvarchar ~~). Похоже, что mvarchar нельзя использовать с оператором Like. Мне нужно преобразовать его в строку. - person Sergei Vatshekin; 04.08.2013