Java 使用JPA/Hibernate禁用获取关联映射
我在JPA/Hibernate上遇到了问题,无论我设置了什么fetch=FetchType.Lazy或fetch=FetchType.Eager 我的自定义方法不起作用(在调试时,我看到答案集合是PersistentBag,每当我调用getter时,答案都会被实际创建,并且我的自定义中带有和的某些条件没有被应用)。 这是我不想要的,我想它将被设置在我的自定义方法 问题是: 1,我做得对吗,在hql查询中禁用获取类型并设置关联 2、如果我做得对,为什么它不起作用,协会只在打电话给getter的时候 3、如果我错了,请告诉我如何实施 谢谢你的阅读 我的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的时候
家长
班级:
@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个查询
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;