Java - JPA 规范:如何在属于嵌套对象的字段上创建 criteria/specification?
Java - JPA-Specification: how to create criteria/specification on a field that belongs to a nested object?
我在我的项目中使用 jdk 1.8、hibernate 和 jpa。并使用 specification/criteria 构建我的搜索查询。
我有一个 class A(一个休眠实体),它有 class B作为一个属性。所以,粗略地说,它看起来像:
@Entity
class A {
Long id;
String comment;
@OneToOne
B b;
}
和...
@Entity
class B {
Long id;
String type;
}
我的 存储库 class 看起来像(大致):
public interface ARepository extends PagingAndSortingRepository<A, Integer>,
JpaSpecificationExecutor<A> {
}
大多数简单的 JPA 查询都按预期工作。即使是直接基于 Class A 的 specification/criteria 也能正常工作。但是,我需要创建一个 动态查询 并且应该在 PagingAndSortingRepository class 的“findAll”方法下执行。 这个查询应该等同于
select * from A a left join B b on a.b_id = b.id
where b.type='final' and a.comment='blah';
我在规范中创建了与上述类似的逻辑,例如:
public Specification<A> getSpecification() {
return (itemRoot, query, criteriaBuilder) -> {
.........
List<Predicate> partialQueries = new ArrayList<>();
partialQueries.add(criteriaBuilder.equal(itemRoot.get("b.type"), "final"));
partialQueries.add(criteriaBuilder.equal(itemRoot.get("comment"), "blah"));
//Other queries to be added...
return criteriaBuilder.and(partialQueries.toArray(new Predicate[0]));
};
}
出现错误:
Unable to locate Attribute with the the given name [b.type] on this ManagedType [com.something.domain.A]
是否了解如何在属于嵌套对象的字段上创建 criteria/specification?
如果要过滤嵌套对象。你可以写
itemRoot.get("NestedTableName").get("nestedfieldname")
In your case - itemRoot.get("B").get("type")
itemRoot.get("根中嵌套对象字段的名称 class").get("nestedfieldname");
示例:
cb.equal(root.get("b").get("类型"),值)
你的情况 - itemRoot.get("b").get("type");
我在我的项目中使用 jdk 1.8、hibernate 和 jpa。并使用 specification/criteria 构建我的搜索查询。
我有一个 class A(一个休眠实体),它有 class B作为一个属性。所以,粗略地说,它看起来像:
@Entity
class A {
Long id;
String comment;
@OneToOne
B b;
}
和...
@Entity
class B {
Long id;
String type;
}
我的 存储库 class 看起来像(大致):
public interface ARepository extends PagingAndSortingRepository<A, Integer>,
JpaSpecificationExecutor<A> {
}
大多数简单的 JPA 查询都按预期工作。即使是直接基于 Class A 的 specification/criteria 也能正常工作。但是,我需要创建一个 动态查询 并且应该在 PagingAndSortingRepository class 的“findAll”方法下执行。 这个查询应该等同于
select * from A a left join B b on a.b_id = b.id
where b.type='final' and a.comment='blah';
我在规范中创建了与上述类似的逻辑,例如:
public Specification<A> getSpecification() {
return (itemRoot, query, criteriaBuilder) -> {
.........
List<Predicate> partialQueries = new ArrayList<>();
partialQueries.add(criteriaBuilder.equal(itemRoot.get("b.type"), "final"));
partialQueries.add(criteriaBuilder.equal(itemRoot.get("comment"), "blah"));
//Other queries to be added...
return criteriaBuilder.and(partialQueries.toArray(new Predicate[0]));
};
}
出现错误:
Unable to locate Attribute with the the given name [b.type] on this ManagedType [com.something.domain.A]
是否了解如何在属于嵌套对象的字段上创建 criteria/specification?
如果要过滤嵌套对象。你可以写
itemRoot.get("NestedTableName").get("nestedfieldname")
In your case - itemRoot.get("B").get("type")
itemRoot.get("根中嵌套对象字段的名称 class").get("nestedfieldname");
示例: cb.equal(root.get("b").get("类型"),值)
你的情况 - itemRoot.get("b").get("type");