gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:59:16 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com