Java 使用JPA/Hibernate禁用获取关联映射

Java 使用JPA/Hibernate禁用获取关联映射,java,hibernate,hql,spring-data-jpa,many-to-one,Java,Hibernate,Hql,Spring Data Jpa,Many To One,我在JPA/Hibernate上遇到了问题,无论我设置了什么fetch=FetchType.Lazy或fetch=FetchType.Eager 我的自定义方法不起作用(在调试时,我看到答案集合是PersistentBag,每当我调用getter时,答案都会被实际创建,并且我的自定义中带有和的某些条件没有被应用)。 这是我不想要的,我想它将被设置在我的自定义方法 问题是: 1,我做得对吗,在hql查询中禁用获取类型并设置关联 2、如果我做得对,为什么它不起作用,协会只在打电话给getter的时候

我在JPA/Hibernate上遇到了问题,无论我设置了什么fetch=FetchType.Lazyfetch=FetchType.Eager

我的自定义方法不起作用(在调试时,我看到答案集合是PersistentBag,每当我调用getter时,答案都会被实际创建,并且我的自定义中带有的某些条件没有被应用)。 这是我不想要的,我想它将被设置在我的自定义方法

问题是:

1,我做得对吗,在hql查询中禁用获取类型并设置关联

2、如果我做得对,为什么它不起作用,协会只在打电话给getter的时候

3、如果我错了,请告诉我如何实施

谢谢你的阅读

我的
家长
班级:

@Entity
@NamedQuery(name="Question.findAll", query="SELECT q FROM Question q")
public class Question implements Serializable {

    //bi-directional many-to-one association to Answer
    @OneToMany(mappedBy="question",fetch=FetchType.LAZY)
    @JsonManagedReference
    private List<Answer> answers;

  ...
}
在我的自定义方法中,我将HQL用作:

    public List<Question> search() {

        String sql = "SELECT distinct(question)"
                + " FROM Question as question "
                + " LEFT JOIN question.answers as answer with answer.isDeleted = true";

        List<Question> result = query.getResultList();

        return result;
    }
公共列表搜索(){
String sql=“选择不同的(问题)”
+“从问题变为问题”
+“将question.answers作为答案与answer.isDeleted=true左连接”;
List result=query.getResultList();
返回结果;
}
另外,我发现我在这篇文章中也有类似的问题
但是我不知道如何遵循他的指示。

JPA没有提供任何关于映射注释以选择获取策略的规范。通常,相关实体可以通过下面给出的任何一种方式获取

  • SELECT=>一个根实体查询+一个相关映射实体/每个根实体集合查询=(n+1)查询
  • SUBSELECT=>一个根实体查询+第二个相关映射实体查询/第一个查询中检索到的所有根实体集合=2个查询
  • JOIN=>一个查询来获取根实体及其所有映射实体/集合=1个查询
使用fetch=FetchType.LAZY设置@OneToMany并添加@fetch(FetchMode.SELECT) 然后您的查询将正常工作。

此查询

SELECT distinct(question)
  FROM Question as question
  LEFT JOIN question.answers as answer with answer.isDeleted = true
意思与

SELECT distinct(question)
  FROM Question
这个问题

SELECT distinct(question)
  FROM Question as question
  INNER JOIN question.answers as answer with answer.isDeleted = true
表示获取至少有一个答案为
isDeleted=true的
问题

要获取惰性关联,可以使用
连接获取

 SELECT distinct(question)
      FROM Question as question
      LEFT JOIN FETCH question.answers
但是,我认为,不可能找到与某个条件有关的关联。 有一个使用EclipseLink的示例:

您可以尝试类似于Hibernate的方法。我想,这是行不通的

另一个选项是使用
@Where

@OneToMany(mappedBy="question",fetch=FetchType.LAZY)
@Where(clause = "is_deleted = 0")
private List<Answer> answers;
@OneToMany(mappedBy=“question”,fetch=FetchType.LAZY)
@其中(子句=“已删除=0”)
私人名单答案;
但是,它可能不适合您,因为不可能禁用
@Where
子句。通过抓取,你永远不会得到所有答案

因此,最好使用单独的查询加载带有条件的答案

@OneToMany(mappedBy="question",fetch=FetchType.LAZY)
@Where(clause = "is_deleted = 0")
private List<Answer> answers;