java - 在应用 Hibernate @Filter 时如何通过 ID 获取实体?

标签 java hibernate

我正在创建一个 library for dealing with temporal entities基于DAO Fusion项目。我遇到的问题之一是,当我通过 ID 查询数据库中的记录时,我在实体类上定义的 @Filter 会被忽略。

我在 package-info.java 中创建了一个过滤器,如下所示:

@FilterDef(name=EFFECTIVITY_FILTER, parameters={@ParamDef(name=EFFECTIVITY_PARAMETER, type=EFFECTIVITY_TYPE)})

以及一个在测试中使用的简单实体:

@Entity
@Table(name = "USER")
@AttributeOverride(name="id", column = @Column(name="USER_ID"))
@Filter(name=EFFECTIVITY_FILTER, condition=":effective between start and end")
public class ImmutableUserEntity extends ImmutablePersistentTimestampTemporalEntity<Long> implements UserEntity<Long> {

  private static final long serialVersionUID = 843453303283850791L;

  private String firstName;
  private String secondName;

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getSecondName() {
    return secondName;
  }

  public void setSecondName(String secondName) {
    this.secondName = secondName;
  }
}

我尝试了以下方法来通过ID获取

IdentifierLoadAccess<Long> longIdentifierLoadAccess = getSession().byId(Long.class);
longIdentifierLoadAccess.getReference(id);

getEntityManager().find(getEntityClass(), id)

但是,我能够通过 I 查找记录并应用过滤器的唯一方法是使用带有 ID 等于谓词的 QueryBuilder:

CriteriaBuilder builder = getSession().getCriteriaBuilder();
    CriteriaQuery<S> criteria = builder.createQuery(targetEntityClass);
    Root<S> root = criteria.from(targetEntityClass);
    criteria.where(builder.equal(root.get("id"), id));
    List<S> resultList = getSession().createQuery(criteria).getResultList();
    if (resultList.size() > 1) {
      throw new NonUniqueResultException();
    }
    return resultList.isEmpty() ? Optional.empty() : Optional.of(resultList.get(0));

但是,这不是很稳健,因为它依赖于实体的 ID 字段命名为“id”。

是否有另一种更强大的方法可以在应用过滤器谓词时通过 ID 进行查询?

最佳答案

我找到了解决方法。我可以按如下方式获取 ID 字段的名称:

String idField = ((MetamodelImplementor)sessionFactory.getMetamodel()).entityPersister(getEntityClass()).getIdentifierPropertyName();

并在我的 where 子句中使用字段名称

criteria.where(builder.equal(root.get(idField), id));

关于java - 在应用 Hibernate @Filter 时如何通过 ID 获取实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58186871/

相关文章:

postgresql - Hibernate 和 PostgreSQL - 序列以 -46 开头

java - 使用 Maven 创建一个包含已编译类和 javadoc 的 jar

JavaCV检测二进制图像上的验证码字母

Java程序检查相似数字

java - Spring-Hibernate 坚持不导致插入

hibernate - 获取一个懒惰的一对多列表的 child

java - 将 AngularJs 对象映射/导航到 Hibernate 实体

java - 没有绑定(bind) Class<> 的注入(inject)器工厂

java - 如何为oracle xe创建dsn?

hibernate - hibernate session 中的持久数据变得陈旧,有时 hibernate 会生成重复的 ID