1

我有两个实体。父母和孩子。

@Entity
public class Parent {

    @Id
    @Column(name = "PARENT_ID")
    private BigInteger id;

    @Column(name = "FIRST_NAME")
    private String firstName;

    @Column(name = "LAST_NAME")
    private String lastName;
}

@Entity
@NamedEntityGraph(name = "Child.parentObj", attributeNodes = @NamedAttributeNodes("parentObj"))
public class Child{
//blah blah blah

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="PARENT_ID")
Parent parentObj;

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name="CHILD_ID")
Set<Address> address
//blah blah blah
}

ChildRepository.java

public interface ChildRepository extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>{

     @EntityGraph(value="Child.parentObj")
     public List<Child> findAll(Specification<Child> spec);
}

我正在尝试按标准查找子实体,它应该始终有父实体。

我收到异常,它试图在地址表中找到 parentObj。

Caused by: org.hibernate.QueryException: could not resolve property: parentObj of: com.xxx.Address [..]

我找到了这个链接并尝试了Joep给出的解决方案,但同样的错误。

Spring Data JPA + JpaSpecificationExecutor + EntityGraph

我错过了什么。我无法理解为什么/如何限制在子对象中查找 parentObj,因为地址没有对父对象的引用。

我正在通过 Address.street 进行搜索。

我也尝试过临时实体图。例外:

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.QueryException: could not resolve property: parentObj of: com.xxx.Address 

Caused by: org.hibernate.QueryException: could not resolve property: parentObj of: com.xxx.Address
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77)
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1978)
    at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:367)
    at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:500)
    at org.hibernate.engine.query.spi.EntityGraphQueryHint.getFromElements(EntityGraphQueryHint.java:95)
    at org.hibernate.engine.query.spi.EntityGraphQueryHint.toFromElements(EntityGraphQueryHint.java:68)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:676)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:665)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.collectionFunctionOrSubselect(HqlSqlBaseWalker.java:4905)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:4606)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2104)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2029)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2029)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:796)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:597)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
    ... 60 more
4

2 回答 2

1

我想通过条件搜索找到子条目并为每个孩子获取 ParentObj。我想加入而不是单独选择父母。我试图通过使用 EntityGraph 来解决这个问题,但它没有用。正如@EKlavya 指出的那样,规范和实体图不能一起工作。

我解决的方法是:

root.fetch("parentObj", JOIN.LEFT);

在我的 toPredicate 方法中。这将在 1 个查询中获得具有父级的子实体。

于 2020-05-28T15:13:18.080 回答
0

您正在使用Child.parentObj作为实体图名称,但您将实体图命名为Child.parent. 利用

@EntityGraph(value="Child.parent")

没有@NamedEntityGraph

我们可以定义一个临时实体图,没有 @NamedEntityGraph 只需使用

@EntityGraph(attributePaths = {"parentObj"})

更新: 实体图和规范都不能一起工作。有办法解决这个问题。不要急切地让父母先获取孩子,然后从孩子中制作一个孩子ID列表,并让父母使用in子句查询使用孩子ID。总共只需要 2 个查询。如果您想使用 1 个查询来解决此问题,请使用 DSL 进行原始查询。

于 2020-04-17T04:24:39.667 回答