我有一个实体,它与另一个用@Where注释的实体有关联,就像这样
public class EntityA {
@OneToMany
@Where(...)
private List<EntityB> entityBList;
}
最近发生了不可避免的事情,我需要加载不符合@Where子句的EntityB。我可以删除@Where注释,但它被大量使用,所以理想情况下我不想这样做。除了手动加载EntityB的列表,还有另一个查询,我有哪些选择?我可以告诉Hibernate忽略@Where注释吗?
答案 0 :(得分:12)
经过大量研究后,似乎根本不可能。我强烈建议避免使用@Where,因为事先很难预测你是否需要这些关联。
答案 1 :(得分:7)
我知道这是一个老问题,但万一有人找答案......我也有同样的困境,你不想在你选择的地方用“is_deleted = false”弄乱你的代码,
简单的解决方案是使用本机SQL:
lst = sessionFactory.getCurrentSession().
createSQLQuery("select {entb.*} from EntityB entb where is_deleted=1")
.addEntity("entb", EntityB.class)
.list();
答案 2 :(得分:6)
您可以使用相同的数据映射另一个属性,如下所示:
public class EntityA {
@OneToMany
@JoinColumn(name='theColumnName', insertable=false, updateable=false)
private List<EntityB> entityBListReadOnly;
}
重要的是设置为可更新的false和可插入的false以避免数据中出现一致性问题!
答案 3 :(得分:6)
我只是有同样的问题。我解决了这样的问题:
@Query(value="SELECT * FROM EntityA", nativeQuery=true)
public ignoreWhereMethod(){}
@Query批注中的SQL必须指向表的名称和字段的名称(而不是实体的名称)。
答案 4 :(得分:1)
另一个解决方案是过滤器,如本问题所述。 Hibernate how to ignore @Where annotation
我将自己尝试一下,因为在我们的情况下,@where
和@NamedNativeQueries
的组合是非常麻烦的解决方案。但是我还不知道@Filter
是否更好。