我有两个具有多对多关系的表,称为位置和内容。
映射是收集的,因为插入和其他查询都可以正常工作。
我用
Criteria c = sessionFactory.getCurrentSession().createCriteria(Content.class);
c.add(Restrictions.isEmpty("position"));
获取数据集,这意味着任何位置都不会占用所有内容。
它运作正常。
然后,我补充说:
Criteria c = sessionFactory.getCurrentSession().createCriteria(Content.class);
c.add(Restrictions.isEmpty("position"));
c.createAlias("position", "p");
c.add(Restrictions.eq("p.id", 100));
这意味着获取所有内容不会被位置100占用。
我得到一个空的回报。
有些人建议我使用:
c.createAlias("position", "p");
c.add(Restrictions.not(Restrictions.eq("p.id", 100)))
它有效,但结果如此sql:
SELECT * FROM `position_has_content` WHERE content_id not in (select content_id from `position_has_content` where position_id = 100)
虽然我需要这样的结果:
SELECT * FROM `content` WHERE `content`.id not in (select content_id from `position_has_content` where position_id = 100)
这是如此不同。
我可以知道我错过了什么吗?
问题解决后我会不断更新。
案例中的表格如下:
position Position_has_content content
id position_id id
content_id
所以,它是多对多的情况,它们已经在hibernate中正确映射了。
映射关系的阶段:
@ManyToMany(mappedBy = "content")
private Set<Position> position;
-------------------------------------------------------------
@ManyToMany(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
@JoinTable(name = "position_has_content", joinColumns = {
@JoinColumn(name = "position_id") },
inverseJoinColumns = { @JoinColumn(name = "content_id") })
@OrderBy("position")
private Set<Content> content;
映射是正确的,因为所有其他操作(正常的EAGER查询没有&#34;不在&#34;,插入,删除双方)都可以正常工作。
答案 0 :(得分:0)
您能否在数据库中发布完整的实体和一些示例条目,以更好地说明您是如何尝试过滤结果的。我希望有很多方法可以实现您期望的结果,但您可以考虑使用DetachedCriteria和exists / not exists子句。无论如何,我会仔细查看更多信息!