当前位置: 首页 > 知识库问答 >
问题:

Spring数据JPA JPA JpaSpecificationExecutor NamedEntityGraph

端木阳荣
2023-03-14

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

@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
}

儿童知识库。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数据JPA JpaSpecificationExecator EntityGgraph

我错过了什么。我无法理解为什么/如何在just Child对象中查找parentObj,因为Address没有引用Parent。

我正在按地址搜索。大街

我也试过自组织实体图。

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

共有2个答案

卞经业
2023-03-14

您正在使用Child。parentObj作为实体图名称,但您将实体图命名为子对象。家长。使用

@EntityGraph(value="Child.parent")

没有@NamedEntityGgraph

我们可以定义一个特殊的实体图,而不需要@NamedEntityGraph

@EntityGraph(attributePaths = {"parentObj"})

更新:实体图和规范都不起作用。有一种方法可以解决这个问题。不要急于只获取父项,然后从子项中列出子项ID,并使用子项ID在子句查询中获取父项。总共只需要2个查询。如果您想使用1查询解决这个问题,请使用DSL进行原始查询。

楚和悌
2023-03-14

我想通过条件搜索找到子条目,并为每个子条目获取ParentObj。我想加入,而不是为家长个人选择。我试图用EntityGraph解决这个问题,但没有成功。正如@EKlavya指出的,规范和EntityGraph不能一起工作。

我解决的方法是:

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

用我的预测方法。这将在1个查询中获得父实体的子实体。

 类似资料:
  • 我正在使用Spring data redis和jedis与aspectJ进行日志记录。但是得到以下错误。请帮助解决此错误。我在这上面花了很多时间,但无法解决它。 我使用的是Spring数据redis 1.4.1,jedis-2.6.1和Redis-2.8 错误详情:- 下面是使用spring data redis的redis Sentinel配置的Java配置文件 下面是用于日志记录的Aspect

  • 我试图用jqGrid解决Spring Data Rest的问题,所有的事情都很好,除了我想要将对象全部作为序列化返回,所以在ManyToOne关系中,我现在只得到该对象的链接,而我想要将它序列化。 如您所见,中的accountManager类返回为link,但我希望它也被序列化,以便在JQGrid中显示Name属性。 向Shahbour问好

  • 我有一个简单的JpaRepository和一个finder,它返回按名为“number”的属性降序排列的记录。“number”属性也是我的实体的@Id。这很好,但是有数千条记录,所以我想返回一个页面而不是列表。 如果我将查找器更改为以下内容,则排序不再起作用。我尝试过使用可分页参数的排序功能,但不起作用。还删除了OrderByNumberDesc,但结果相同。 EDIT-添加控制器方法 以下是我的

  • 我正在使用spring数据jpa为我的服务实现多事务(数据库),带有两个持久的单元名。并在Jboss 6.4 EAP中部署 以下是我的服务详情 在Jboss中,我无法部署它,我遇到以下异常: 原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有com.test.demo.domain.repository.Tb

  • 问题是,Spring HATEOAS和Spring Data Rest之间有什么区别? 我觉得两者都可以做同样的事情,Spring数据Rest(作为Spring数据的一部分)似乎更有活力。 https://github.com/spring-projects/spring-hateoas https://github.com/spring-projects/spring-data-rest 你什么

  • 问题内容: 以下是我的申请流程 控制器-服务-存储库 在服务层,我们具有注释。我们还具有配置,在其中指定实体管理器和txn管理器。 我的怀疑是我认为考虑了在其中指定的txn管理器,并且在服务层进行指定没有影响。例如:服务层可以映射到自定义的txn管理器,其中服务调用的存储库可能具有不同的txn管理器。在那种情况下会不会造成问题? 有人可以澄清一下,在使用jpa存储库时是否需要将其放置在服务层上?

  • 我刚开始使用和*对象,我一直在做一个简单的左连接,并将一个值与一个连接的实体属性进行比较。由于我要构建的这个查找/选择函数迟早会非常动态,我决定使用Criteria对象,而不是使用不同的参数构建不同的函数。我的真实实体有更多的属性,但我在这里分解它来简化它。 之前,我试图做我的第一步我有一个仓库函数,这是注释与和工作正常: 后来,我试图建立一个忽略小写和名称的规范,但我仍然无法正确地将name参数

  • 我有以下数据模型 和spring数据存储库接口 但findByIdIn方法返回一个空列表,即使mongodb中存在ID。我已经为文档中的其他字段测试了findbyxxin(),它们都工作得很好。但当涉及到文档id时,情况并非如此。 这是我第一次使用mongoDB,但我熟悉Spring data jpa。 我知道 但我还需要对结果应用分页,因此对我的情况没有帮助。 我尝试使用@Query(带有in查