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

将@EntityGraph与JPA构造函数表达式一起使用

孟自强
2023-03-14

我有一个使用构造函数表达式的查询。在大多数情况下,它是工作的,但是我想减少数据库上的查询数量。所以我尝试了FETCH和@EntityGgraph,但是我得到了

org.springframework.dao.InvalidDataAccessResourceUsageException:查询指定的联接提取,但提取关联的所有者不在选择列表中[FromElement{explicit,不是集合联接,提取联接,提取非惰性。。。

我尝试删除FETCH,只使用JOIN来解决问题,但它不执行FETCH操作。

Hibernate/JPA是否允许或可能这样做?

代码方面看起来有点像

@Query("select new example.BillingTargetAndStudent(bt,s) from Student s, BillingTarget bt where s.id = bt.targetID and bt.account.status = :accountStatus and bt.account.organization = :organization")
Stream<BillingTargetAndStudent> streamAllByOrganizationAndStatusForStudentList(Organization organization, AccountStatus accountStatus);

我要做的是在同一查询中获取bt.account和s.user.attributes。bt.account并不难解决,但是s.user.attributes不可能与构造函数表达式一起使用,因为它是一个集合

共有1个答案

赖渊
2023-03-14

我最终做的是使用流

default Stream<BillingTargetAndStudent> streamAllByOrganizationAndStatusForStudentList(Organization organization, AccountStatus accountStatus) {

    return streamAllByOrganizationAndStatusForStudentList0(organization, accountStatus)
        .map(o -> new BillingTargetAndStudent((BillingTarget) o[0], (Student) o[1]));
}

@Query("select bt, s from Student s join fetch s.user u join fetch u.attributes, BillingTarget bt join fetch bt.account a where s.id = bt.targetID and bt.account.status = :accountStatus and bt.account.organization = :organization")
Stream<Object[]> streamAllByOrganizationAndStatusForStudentList0(Organization organization, AccountStatus accountStatus);

我可以通过输入一个@EntityGraph

@EntityGraph("Student.forStudentList")
@Query("select bt, s from Student s, BillingTarget bt left join fetch bt.billingContractTargets bct join fetch bt.account a where s.id = bt.targetID and bt.account.status = :accountStatus and bt.account.organization = :organization")
Stream<Object[]> streamAllByOrganizationAndStatusForStudentList0(Organization organization, AccountStatus accountStatus);
@NamedEntityGraph(
    name = "Student.forStudentList",
    attributeNodes = {
        @NamedAttributeNode("schedules"),
        @NamedAttributeNode(value = "user", subgraph = "user.attributes"),
    },
    subgraphs = {
        @NamedSubgraph(name = "user.attributes",
            attributeNodes = {@NamedAttributeNode("attributes")})
    }
)

但我仅限于一个,它必须是存储库的实体。我不能说

@EntityGraph("BillingTarget.forStudentList")
@EntityGraph("Student.forStudentList")
 类似资料:
  • 我分配给类的属性是: 我需要设置ISSOLD,并敦促其设置为false。这就是我创建默认构造函数的原因。但是我使用Builder()来设置类字段,并且在某个地方使用getter/setter来设置属性。 我的要求是将isPurpressed/IsSoldOut设置为True/False,但不能为NULL。 请指导我如何才能做到这一点。

  • 问题内容: 有没有一种方法可以在一个查询中包含多个语句(hibernate)? 这对我有用: 我在中得到了预期的结果。 但是我想要的是与它的构造器有一个新的实例。 例如这样: 或在 我也有兴趣使用DTO对象和DTO对象,但我无法读懂吗?那正确吗? 使用两个示例时,我的Spring Boot应用程序确实从错误开始。 最后我要一张地图 问题答案: 从技术上讲,根据JPQL select子句的定义,它将

  • 我试图弄清楚如何在CDI中使用构造函数注入,其中一个参数是JNDI查找。 用正常的打野,我可以做到以下几点: 如何指定参数是通过JNDI查找检索的bean?在哪里指定JNDI名称?

  • 我试图使用std::vector构造函数的“fill”版本。它将元素的数量作为第一个参数,并使用const value_type 然而,我似乎无法使这个工作与unique_ptrs: 两者都不适用于unique_ptrs。我从Visual Studio 2017得到的错误是: 错误C2280'std::unique_ptr 考虑到第二个参数使用const引用向量中包含的类型,我希望std::uni

  • 想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来回答事实和引文。 我确实使用Spring和Lombok 没有原型bean,我们必须传递目标类所需的依赖项 我们如何将bean标记为原型并正确处理依赖bean和构造函数参数? 选项1 -没有原型beans 选项 2 - 原型豆

  • 我正在尝试将文件的绝对值传递给类路径的read函数。 如果我将绝对路径与类路径一起传递,它就会很好地工作。但当我传递嵌入式表达式时,它不起作用 我的代码如下 给定url appServer给定参数creationMethod=“swagger_first”和路径“/integration/rest/rad” 和头X-CSRF-TOKEN=csrfToken*cookie JSESSIONID=JS