Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以通用方式使用Criteria API从entityClass中选择多个属性_Java_Hibernate_Criteria Api - Fatal编程技术网

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]

我的问题是:

  • 如何以通用方式使用CriteriaAPI获取元素集合。PS:我注意到路径通常是hibernate类型的
    SingleAttributePath
    ,当elementcollection类型为
    PluralAttributePath
  • 我这样做是完全错误的吗?使用CriteriaAPI是否有更简单的方法?我可以想象对命名查询执行类似的操作,但我只是不再在实体类上使用命名查询,因为它变得不可读,我需要一种更灵活的方法
  • 我试图获取的实体类中的元素集合如下所示:

    @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

    虽然这不是对您问题的直接回答,但我认为这是一个完美的应用案例

    我创建了这个库,以便在JPA模型和自定义接口或抽象类定义的模型之间进行简单的映射,类似于类固醇上的Spring数据投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型

    在Blaze持久性实体视图中,可能的DTO模型如下所示:

    @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();
        }
    }