【问题标题】:how could i use JPA criteria query api for joined columns?我如何使用 JPA 标准查询 api 来连接列?
【发布时间】:2011-06-15 10:18:33
【问题描述】:

我是 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;
    }

代码没问题,当我尝试过滤列(未连接的列)时,但当我尝试过滤时

查询连接列,生成的查询不正确并引发异常。

所以我的问题是,我如何使用 JPA 条件查询 api 来同时过滤行

连接列和非连接列。

谢谢

【问题讨论】:

    标签: jpa foreign-key-relationship criteria-api


    【解决方案1】:

    我不相信您可以将连接列视为常规列。

    例如,如果要过滤 B 的 id,则必须创建从 A 到 B 的连接,然后使用 B_.id 来匹配值。

    谢伊

    【讨论】:

      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 2020-12-16
      • 2012-09-25
      • 2017-03-13
      • 2013-01-07
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      相关资源
      最近更新 更多