我在类级别用@Where属性注释了一个Hibernate实体。
这限制了我直接查询实体时要加载的实体,但似乎不适用于该类的集合。这是可以预期的吗?

文档尚不清楚:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-class

其中(可选):指定要使用的任意SQL WHERE条件
在检索此类的对象时使用。

在我看来,这听起来像适用于检索该类对象的所有情况,但是我发现对于集合来说,这被忽略了。

  • 这是要用于收藏吗?
  • 如果不是,将过滤器全局应用于类的所有实例以及该类的所有集合的最佳方法是什么?

  • (更新:我提出了https://hibernate.atlassian.net/browse/HHH-6781来跟踪文档问题。)

    最佳答案

    使用“getAll”或“loadAll”时,@ Where在类级别将省略不需要的实例。在类级别具有@Where不会“级联”应用于该实体上的集合。

    @在集合属性级别
    public 类PuppySeller {

        @Where(clause = "status='FOR_SALE'")
        public Set<Puppy> getPuppiesForSale() {}
    

    将确保您从数据库中选择“PuppySeller”时,“puppiesForSale”将仅由状态为“FOR_SALE”的幼犬填充。

    但是,请务必谨慎,因为它仅适用于第一级收藏。我的意思是说您有一只小狗,并且您想让同一位卖家出售所有小狗。您可能会执行类似“myPuppy.getPuppySeller()。getPuppiesForSale()”的操作。但是,如果这样做,最终将导致所有不分状态的,属于uppySeller的幼犬,包括所有“已出售”或“NEWBORN”的幼犬,等等。

    09-30 14:14
    查看更多