Как я могу использовать API запроса критериев JPA для соединенных столбцов? - PullRequest
3 голосов
/ 15 июня 2011

Я новичок в JPA, и у меня есть проблема с ним.

предположим, что у нас есть две таблицы, которые связаны

ассоциацией ManytoOne, что означает, что

В таблице A хранится первичный ключ таблицы B.

когда эти две таблицы сопоставлены с сущностями JPA

У меня проблема с поиском в этой ситуации.

Я использовал существующий код из демонстрации richfaces, чтобы управлять фильтрацией и сортировкой, используя

JPA. этот код использует входные параметры для создания запроса критериев.

это код:

private CriteriaQuery<T> createSelectCriteriaQuery() {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(entityClass);
        Root<T> root = criteriaQuery.from(entityClass);

        if (arrangeableState != null) {

            List<Order> orders = createOrders(criteriaBuilder, root);
            if (!orders.isEmpty()) {
                criteriaQuery.orderBy(orders);
            }

            Expression<Boolean> filterCriteria = createFilterCriteria(criteriaBuilder, root);
            if (filterCriteria != null) {
                criteriaQuery.where(filterCriteria);
            }
        }

        return criteriaQuery;
    }
    protected Expression<Boolean> createFilterCriteriaForField(String propertyName, Object filterValue, Root<T> root, CriteriaBuilder criteriaBuilder) {
        String stringFilterValue = (String) filterValue;
        if (Strings.isNullOrEmpty(stringFilterValue)) {
            return null;
        }

        stringFilterValue = stringFilterValue.toLowerCase(arrangeableState.getLocale());

        Path<String> expression = root.get(propertyName);
        Expression<Integer> locator = criteriaBuilder.locate(criteriaBuilder.lower(expression), stringFilterValue, 1);
        return criteriaBuilder.gt(locator, 0);
    }


    private Expression<Boolean> createFilterCriteria(CriteriaBuilder criteriaBuilder, Root<T> root) {
        Expression<Boolean> filterCriteria = null;
        List<FilterField> filterFields = arrangeableState.getFilterFields();
        if (filterFields != null && !filterFields.isEmpty()) {
            FacesContext facesContext = FacesContext.getCurrentInstance();

            for (FilterField filterField : filterFields) {
                String propertyName = (String) filterField.getFilterExpression().getValue(facesContext.getELContext());
                Object filterValue = filterField.getFilterValue();

                Expression<Boolean> predicate = createFilterCriteriaForField(propertyName, filterValue, root, criteriaBuilder);

                if (predicate == null) {
                    continue;
                }

                if (filterCriteria == null) {
                    filterCriteria = predicate.as(Boolean.class);
                } else {
                    filterCriteria = criteriaBuilder.and(filterCriteria, predicate.as(Boolean.class));
                }
            }

        }
        return filterCriteria;
    }

код в порядке, когда я пытаюсь фильтровать столбцы (не объединенные столбцы), но когда я пытаюсь

запрос к объединенному столбцу, полученный запрос некорректен и выдает исключение.

поэтому мой вопрос заключается в том, как я могу использовать API запросов JPA-критериев для фильтрации строк по обоим

соединенные столбцы и несвязанные столбцы.

спасибо

1 Ответ

1 голос
/ 27 сентября 2011

Не думаю, что вы можете относиться к столбцам соединения как к обычным.

например, если вы хотите отфильтровать по идентификатору B, вам нужно создать соединение от A до B, а затем использовать B_.id для сопоставления значений.

Шей

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