Spring Data JPA + JpaSpecificationExecutor + NamedEntityGraph - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть две сущности. Родитель и ребенок.

@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 только в Child Object, так как Address не имеет ссылки на Parent.

Я выполняю поиск по Address.street.

У меня есть попробовал ad-ho c граф сущностей тоже. исключение:

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

1 Ответ

0 голосов
/ 17 апреля 2020

Вы используете Child.parentObj в качестве имени графа сущностей, но вы назвали граф сущностей Child.parent. Используйте

@EntityGraph(value="Child.parent")

Без @ NamedEntityGraph

мы можем определить граф сущности ad-ho c, без @NamedEntityGraph просто используйте

@EntityGraph(attributePaths = {"parentObj"})

Обновление: График объекта и спецификация не работают вместе. Есть способ решить это. Не пытайтесь вначале получить родительский выбор только потом, затем составьте список дочерних идентификаторов из дочерних и заставьте родителей использовать в запросе предложения с использованием дочерних идентификаторов. Всего нужно только 2 запроса. Если вы хотите решить эту проблему с помощью 1 запроса, используйте DSL для выполнения необработанного запроса.

...