如何解决如何使用JPA条件查询api来连接列?
| 我是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来同时过滤行
连接列和非连接列。
谢谢
解决方法
我不认为您可以像对待普通列一样对待连接列。
例如,如果要过滤B的id,则必须创建一个从A到B的联接,然后使用B_.id匹配值。
y
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。