Java 如何以通用方式使用Criteria API从entityClass中选择多个属性
我有一个Java 如何以通用方式使用Criteria API从entityClass中选择多个属性,java,hibernate,criteria-api,Java,Hibernate,Criteria Api,我有一个BaseService类,该类具有用于一般创建、更新、删除和查找实体类的方法 我试图在这个类中创建一个方法,该方法只查询我作为这个方法的参数提供的属性列表 出于性能原因,这是必要的,因为有些实体具有许多属性,其中一些属性一直被查询,但它们几乎从不需要(并且为空) 下面是我的想法,适用于正常情况。然而,在一个边缘情况下,我希望获取元素集合中的属性。当我向列表提供作为元素集合的元素时,该方法将失败,并出现以下错误: org.hibernate.QueryException:不是实体[选择 从
BaseService
类,该类具有用于一般创建、更新、删除和查找实体类的方法
我试图在这个类中创建一个方法,该方法只查询我作为这个方法的参数提供的属性列表
出于性能原因,这是必要的,因为有些实体具有许多属性,其中一些属性一直被查询,但它们几乎从不需要(并且为空)
下面是我的想法,适用于正常情况。然而,在一个边缘情况下,我希望获取元素集合中的属性。当我向列表提供作为元素集合的元素时,该方法将失败,并出现以下错误:
org.hibernate.QueryException:不是实体[选择
从my.package.customAttribute生成的Dias0.valueTypeSubset为
生成的ALIAS0]
我的问题是:
SingleAttributePath
,当elementcollection类型为PluralAttributePath
时@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "custom_attribute_value_type_subset", joinColumns = @JoinColumn(name = "custom_attribute_ref_key"))
@Column(columnDefinition = "text")
private Set<String> valueTypeSubset = new HashSet<>();
此示例使用以下命令运行:
- 爪哇11
- 夸克斯1.13
- 冬眠5.4.29
- 博士后13.2
@EntityView(User.class)
public interface UserDto {
@IdMapping
Long getId();
String getName();
Set<RoleDto> getRoles();
@EntityView(Role.class)
interface RoleDto {
@IdMapping
Long getId();
String getName();
}
}
@EntityView(User.class)
公共接口用户DTO{
@IdMapping
长getId();
字符串getName();
设置getRoles();
@EntityView(Role.class)
接口角色{
@IdMapping
长getId();
字符串getName();
}
}
查询是将实体视图应用于查询的问题,最简单的就是按id进行查询
UserDto a=entityViewManager.find(entityManager,UserDto.class,id)代码>
最好的是,它只会获取实际需要的状态!有一个Quarkus集成,因此如果需要,您甚至可以将其用于本机映像。表示不支持该集成。也许它仍然不被支持。你试过了吗?也许您可以使用相同的实体类,并为不需要查询的字段传递空值。谢谢您的想法。我可以尝试一个包装器,但是它感觉像是有很多代码重复和独立的类。此外,一些enity类的各种实现可能会使其不太合适。我尝试了包装器,但它在元素集合上也失败了。看起来很有趣,感谢您的建议。但是我希望动态运行查询,而不是为每个视图创建DTO。但我以后会更仔细地看一看!您可以请求仅初始化在实体视图中定义的属性的子集。这也用于在GraphQL集成中实现高效的抓取。我原以为我过去也需要完全动态的模型,但结果证明,我大多数情况下只有2-3种表示(下拉、表格、细节)。对于表格表示,如果支持动态列,则跳过属性是有意义的。
@EntityView(User.class)
public interface UserDto {
@IdMapping
Long getId();
String getName();
Set<RoleDto> getRoles();
@EntityView(Role.class)
interface RoleDto {
@IdMapping
Long getId();
String getName();
}
}