JPA: Как выполнить LIKE со столбцом NUMBER в статической метамодели JPA? - PullRequest
3 голосов
/ 21 марта 2012

У меня есть статическая метамодель со столбцом NUMBER (на самом деле, BigDecimal, не спрашивайте, почему).Теперь я хотел бы сделать запрос LIKE для этого числового столбца:

CriteriaBuilder cb;
cb.like(entity.get(Entity_.numbercol), "123%");

, где entity.get(Entity_.numbercol) возвращает Path<BigDecimal>.Естественно, я получаю ошибку компиляции: ...like(Expression<String>, ...) ... not applicable for the arguments (Path<BigDecimal>, ...)

Преобразование столбца с .as(String.class) завершается неудачно из-за некоторой ошибки в JPA, но сейчас у меня нет номера ошибки.Однако, это не исправлено в последней версии JPA / Hibernate.В любом случае, это приводит к исключению во время выполнения о том, что генерируется недопустимый оператор SQL.

Теперь мне просто нужен способ получить API-критерий, эквивалентный SQL

... WHERE numbercol LIKE '123%';

Поиск по темеуже вызвала следующие ответы, которые не помогают, потому что у меня есть статическая метамодель: NHibernate - самый простой способ выполнить поиск LIKE по целочисленному столбцу с помощью API Criteria? и JPA / Criteria API- Как и равные проблемы

Есть идеи?

Заранее спасибо Доминик

Ответы [ 2 ]

11 голосов
/ 22 октября 2013

Для людей, которые все еще ищут решение.

Зная, что функция HQL str выполняет свою работу (по крайней мере, для Hibernate v. 3.6.9.Final), можно реализовать свой собственный FunctionExpression, например:

//plagiarized from org.hibernate.ejb.criteria.expression.function.CastFunction
public class StrFunction<Y extends Number> extends BasicFunctionExpression<String> implements FunctionExpression<String>, Serializable {
    public static final String FCT_NAME = "str";

    private final Selection<Y> selection;

    public StrFunction(CriteriaBuilder criteriaBuilder, Selection<Y> selection) {
        super((CriteriaBuilderImpl) criteriaBuilder, String.class, FCT_NAME);
        this.selection = selection;
    }

    @Override
    public void registerParameters(ParameterRegistry registry) {
        Helper.possibleParameter(selection, registry);
    }

    @Override
    public String render(CriteriaQueryCompiler.RenderingContext renderingContext) {
        return FCT_NAME + '(' + ((Renderable) selection).render(renderingContext) + ')';
    }
}

, а затемиспользуйте это:

cb.like(new StrFunction<Long> (cb, root.get(MyObject_.id)), "%mySearchTerm%");
0 голосов
/ 22 марта 2012

Нет, это не ошибка из-за ошибки, она работает так, как указано (например, в Javadoc ):

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

Используемый вами метод выполняет приведение, и вам нужно преобразование.Как правило, в JPA нет поддержки для преобразования из BigDecimal в String.

...