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");