我在我的项目中使用jdk 1.8, hibernate和jpa。并使用规范/标准来构建我的搜索查询。
我有一个类a(一个hibernate实体)),它将类B作为属性. 所以,它大致看起来像:@Entity
class A {
Long id;
String comment;
@OneToOne
B b;
}
和
@Entity
class B {
Long id;
String type;
}
我的<<p> strong>库类看起来(大致)如下:
public interface ARepository extends PagingAndSortingRepository<A, Integer>,
JpaSpecificationExecutor<A> {
}
大多数简单的JPA查询都按预期工作。甚至直接基于A类的规范/标准也是有效的。但是,我需要创建一个动态查询这应该在"findAll"下执行。PagingAndSortingRepository类的。这个查询应该等同于
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]));
};
}
And get error:
Unable to locate Attribute with the the given name [b.type] on this ManagedType [com.something.domain.A]
关于如何在属于嵌套对象的字段上创建标准/规范的任何见解?
如果要过滤嵌套对象。你可以写
itemRoot.get("NestedTableName").get("nestedfieldname")
In your case - itemRoot.get("B").get("type")
itemRoot.get("根类中嵌套对象字段的名称").get("nestedfieldname");
的例子:cb.equal (root.get("b" . get("type",值)
在您的例子中- itemRoot.get("b").get("type");