【问题标题】:Strange phenomena in hibernate not in with criteria休眠中的奇怪现象不符合标准
【发布时间】:2015-01-19 07:43:07
【问题描述】:

我有两个名为 Position 和 Content 的多对多关系表。

映射是collect,因为insert等查询都可以正常工作。

我用

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

所以,这是多对多的情况,它们已经在休眠中正确映射。

映射关系阶段:

@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查询,两侧的插入,删除)都可以正常工作。

【问题讨论】:

  • 条件 c = sessionFactory.getCurrentSession().createCriteria(Content.class); c.createAlias("位置", "p"); c.add(Restrictions.eq("p.id", 100));列表 nc = c.list(); List idList = new ArrayList(); for(内容续:nc){ idList.add(cont.getId());条件 c2 = sessionFactory.getCurrentSession().createCriteria(Content.class).setFetchMode("position", FetchMode.SELECT); if(nc.size()!=0) c2.add(Restrictions.not(Restrictions.in("id",idList)));返回 c2.list();我知道这不是高效和有效的,所以有什么想法可以帮助吗?谢谢。

标签: hibernate hibernate-criteria


【解决方案1】:

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

【讨论】:

  • 好的,这里有详细信息。
  • 我用过,但是子查询不支持“不在”的好方法,或者我只是不知道如何实现。非常感谢。
  • @CharlesLi - 您能否发布您的完整实体和休眠映射文件(如果您使用基于 XML 的配置)。您能否再次检查您的关系是否正确。我可以理解“内容”为什么/如何占有一席之地,但我不明白它是如何变成多对多关系的。一个内容可以有多个位置吗?一个职位是否可以被多个内容占用?
  • 感谢您的帮助,因为位置维护了一个内容列表,将分析使用的内容数量和种类,使用或等待使用。
猜你喜欢
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2012-12-24
相关资源
最近更新 更多