我正在创建一个 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/