休眠中的奇怪现象与标准无关

时间:2015-01-19 07:43:08

标签: hibernate hibernate-criteria

我有两个具有多对多关系的表,称为位置和内容。

映射是收集的,因为插入和其他查询都可以正常工作。

我用

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;,插入,删除双方)都可以正常工作。

1 个答案:

答案 0 :(得分:0)

您能否在数据库中发布完整的实体和一些示例条目,以更好地说明您是如何尝试过滤结果的。我希望有很多方法可以实现您期望的结果,但您可以考虑使用DetachedCriteria和exists / not exists子句。无论如何,我会仔细查看更多信息!