java - 如何在 Hibernate 中限制集合的内容

标签 java hibernate jpa hibernate-mapping

假设我有一个实体

@Entity
public class Person {
    ...

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "PERSON_ID")
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Item> items;

    // probably getters and setters returning the collection

}

现在我希望创建某种过滤机制来删除特定项目。

例如,我想要一个过滤器/谓词/主管/...,它将:

  • 将列表限制为最新的 10 个(比较 item.getDate())
  • 将列表限制为仅比某个日期更新的项目(同样,使用 item.getDate() 进行比较)
  • 将列表限制为名称以“A”开头的项目(item.getName()和一些逻辑)
  • 或执行任何其他可插入逻辑...

我希望这个“过滤器”在从数据库加载后执行(这样客户端就不会看到不匹配的项目,例如太旧而无法显示),并且当实体存储/更新到DB(因此不会保存无效项目)。

这可能吗?在 JPA2 中,我会使用 @PrePersist@PostLoad (等) Hook 并在回调中进行过滤,但在 Hibernate 中(使用 Session 接口(interface),而不是 EntityManager)我不知道该怎么做。

最佳答案

以下是一些可能有用的东西:

Hibernate 过滤器(不符合 JPA):

https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/filters.html

Hibernate @Where 注释(不符合 JPA):

http://www.concretepage.com/hibernate/example-where-hibernate

数据库 View (符合 JPA 标准)

创建过滤数据的数据库 View 并将实体映射到该 View 。

关于java - 如何在 Hibernate 中限制集合的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26501436/

相关文章:

java - 调用wait()方法后锁被释放?

java - 超时后终止长时间运行的查询

java - 如何将 @Transactional 与 Spring Data 一起使用?

java - JPA:如何在设置参数后获取/打印(类型化)查询后面的 JPQL 查询字符串?

java - 不寻常的异常(exception)

java - 使用gson gradle从JSON读取键和值

java - 使用 RMI 在远程系统上打开记事本

java - 升级 Hibernate Search 时未找到 : org. hibernate.search.jpa.FullTextEntityManager 的 ClassLoaders

java - 如何读出带冒号的列(:) in its name in hibernate and postgresql

java - hibernate中表的位置