Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringData/Hibernate生成两个查询,而不是一个联接_Java_Hibernate_Spring Data Jpa_Spring Data - Fatal编程技术网

Java SpringData/Hibernate生成两个查询,而不是一个联接

Java SpringData/Hibernate生成两个查询,而不是一个联接,java,hibernate,spring-data-jpa,spring-data,Java,Hibernate,Spring Data Jpa,Spring Data,背景:我有两个表格:问卷和问题部分。问卷可以有许多问题部分。问卷和问题部分都有开始和结束日期,以确定它们是否为活动记录 以下是我的实体: @实体 @资料 公共课问卷{ @身份证 @GeneratedValuestrategy=GenerationType.AUTO 私有UUID; 私有字符串名称; 私人日期开始日期; 私人日期结束日期; 私有字符串描述; @OneToManycascade=级联型。全部, fetch=FetchType.LAZY, mappedBy=调查问卷 @JsonMana

背景:我有两个表格:问卷和问题部分。问卷可以有许多问题部分。问卷和问题部分都有开始和结束日期,以确定它们是否为活动记录

以下是我的实体:

@实体 @资料 公共课问卷{ @身份证 @GeneratedValuestrategy=GenerationType.AUTO 私有UUID; 私有字符串名称; 私人日期开始日期; 私人日期结束日期; 私有字符串描述; @OneToManycascade=级联型。全部, fetch=FetchType.LAZY, mappedBy=调查问卷 @JsonManagedReference private List questionSections=新建ArrayList; } @实体 @资料 公开课问题组{ @身份证 @GeneratedValuestrategy=GenerationType.AUTO 私有UUID; 私有字符串名称; 私有字符串描述; 私人层面; 私人日期开始日期; 私人日期结束日期; @ManyToOnefetch=FetchType.LAZY,可选=false @JoinColumnname=调查问卷\ ID,nullable=false @JsonBackReference 私人问卷; } 以下是我的Spring数据存储库,其中包含一个声明的方法:

公共接口问题报告扩展了JPA报告{ 调查问卷FindBynameandDateIsNullString名称; //上一个目标查询,但一直运行到上面的简单查询 //调查问卷FindByAndQuestionSectionSendDateIsNullUUID; } 上述派生查询生成两个查询,如下所示:

-简而言之 选择inventory.id作为id 问卷调查。描述作为描述 问卷调查。结束日期作为结束日期 问卷调查。开始日期为开始日期 来自调查问卷 其中,questionly.name='Foo'和questionly.end_date为空 选择questionsection.Questions\u id作为问卷id …这里的其他田地。。。 来自问题组 其中questionsection.questionly_id=来自上述查询的id 然后SpringData或Hibernate将上述两个查询组合成一个代表问卷对象的数据对象,并返回该数据对象

我的问题是,我希望一个查询在两个表之间运行,而不是两个表之间运行,然后在内存中合并结果。我对Spring数据和ORMs有着丰富的经验,但还没有找到任何文档来说明为什么会发生这种情况。老实说,我不在乎,只是我的初衷是查询父实体,并“过滤”出结束日期不活动的子实体。上面注释掉的这个派生查询显示了相同的行为,最终导致返回的数据集包含结束日期的问题部分。
我知道还有100种其他方法可以解决这个问题,这很好,因此,如果有人对这种行为有任何了解的话,这对我来说更具教育意义。我可能错过了一些非常简单的东西。

您应该可以使用JPA2.1中引入的实体图功能来完成这项工作

public interface QuestionnaireRepository extends JpaRepository<Questionnaire, UUID> {
  @EntityGraph(attributePaths = { "questionSections" })
  Questionnaire findByNameAndEndDateIsNull(String name);
}
Spring数据通过@NamedEntityGraph和@EntityGraph注释提供对实体图的支持:

因此,在您的代码中:

实体:

@Entity
@NamedEntityGraph(name = "Questionnaire.questionSections",
    attributeNodes = @NamedAttributeNode("questionSections ")
)
public class Questionnaire{
    //...
}
存储库:

public interface QuestionnaireRepository extends JpaRepository<Questionnaire, UUID> {

  @NamedEntityGraph("Questionnaire.questionSections")
  Questionnaire findByNameAndEndDateIsNull(String name);
}

它只执行一个查询来获取调查问卷。但是,您或您的JSON序列化程序可能会迭代问题部分,因此Hibernate需要初始化惰性集合,因此它会生成第二个查询。如果您想一次加载所有内容,则需要一个左连接获取,如文档所述:@jbnize不确定,我同意您在Hibernate文档中指出的内容,但前提是我没有试图通过派生查询来实现这一点。我想我应该指定我希望通过Spring数据派生查询而不是使用指定的查询来实现这一点。将fetch模式更改为eager仍然会导致生成两个查询。您想对作业使用错误的工具,然后。。。