【问题标题】:ManyToOne with where clause带有 where 子句的 ManyToOne
【发布时间】:2012-04-30 02:36:56
【问题描述】:

我有一些逻辑删除的记录(即active=false)导致我的@ManyToOne 映射出现问题,因为连接列返回了多个结果。

我只需要包含active=true 我认为可以通过以下方式实现的记录:

@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "site_id", referencedColumnName = "site_id", insertable = false, updatable = false)
@WhereJoinTable(clause = "active=true")
private Site site;

但是,WhereJoinTable 似乎没有被 hibernate 使用(也许它只对OneToMany 有效?)因为active=true 没有出现在生成的 SQL(日志)中并且问题仍然存在。

是否可以包含用于连接 ManyToOne 的 where 子句以及如何加入?

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

    @ManyToOne 不支持@WhereJoinTable。关于五年以来开放的主题存在错误HHH-4335。我不知道任何解决方法,除了使用错误报告中提到的视图(在只读访问的情况下)。

    【讨论】:

    • 是否可以重新映射同一个表并在映射上放置一个过滤器,即我有一个只读的ActiveSite 实体?
    • 是的,你可以这样做。但正如预期的那样,ActiveSite 和 Site 实例之间的连接对于 Hibernate 是未知的。因此,只有在从数据库中读取(或刷新)相应站点时,才会将对相应站点所做的更改镜像到 ActiveSite。
    • 是的,在这种情况下是可以接受的,但是我正在尝试在我的@Entity 上使用@Where(clause="active=true") 并且休眠将其转换为site0_.active=site0_.true .. 如果你能帮我解决我会给你打勾(因为你的答案是对的..)谢谢你的帮助!
    • 没关系,“active”(没有“=true”)可以正常工作。再次感谢。
    • 亲爱的#pstanton你是如何使用@where的,请你过去。
    【解决方案2】:

    @JoinColumnOrFormula 注释是一种合适的解决方法

    【讨论】:

    • 这不是问题的答案,请使用 cmets 进行讨论和非答案相关的帖子
    【解决方案3】:

    对我有用的解决方案是在类的顶部添加 @where 注释,请参见下一个示例:

    @Where(clause = "state_.idCity=0")
    @SuppressWarnings("serial")
    @Entity
    @Table(name="city", schema="catalog")
    @SequenceGenerator(name = "default_gen", sequenceName = "IDSERIEINVALIDO", allocationSize = 1)
    public class Citye implements Serializable{
            
        @Id 
        private Long id;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      相关资源
      最近更新 更多