2011-06-15 87 views
3

我是JPA的新手,我遇到了問題。我怎樣才能使用JPA標準查詢API加入列?

假設我們有兩個,它們通過多對一關聯的,這意味着

表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,雙方

聯接的列和非固定coulmns過濾行。

謝謝

回答

1

我不相信你可以像普通的那樣對待連接列。

例如,如果要過濾B的ID,則必須創建從A到B的連接,然後使用B_.id來匹配值。

Shay