Java - JPA-Specification:如何在属于嵌套对象的字段上创建标准/规范?



我在我的项目中使用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");

相关内容

  • 没有找到相关文章

最新更新