hibernate jpa sqlresultsetmapping嵌套类构造函数

z0qdvdin  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(337)

我不熟悉hibernate和spring编程,我正在尝试更好地理解注解并使用它。我的问题是,你能不能嵌套构造函数的结果。我当前的Map与此类似。

@SqlResultSetMapping(name="obj", 
    classes={
        ConstrutorResult(targetClass=ClassA.class, columns{
            @ColumnResult(name="type1key", type=String.class),
            @ColumnResult(name="type1desc", type=String.class),
            @ColumnResult(name="type2key", type=String.class),
            @ColumnResult(name="type2desc", type=String.class),
            ...
        }
    }
)

我想知道你是否可以Map到嵌套类的。因此,我Map到的类包含单独处理数据的类,并且标记为@transient。那么像下面这样的事情是可能的吗?

@SqlResultSetMapping(name="obj",
    classes={
        @ConstrutorResult(targetClass=ClassA.class, columns{
            @ConstrutorResult(targetClass=PropertyClassA.class, columns{
                @ColumnResult(name="type1key", type=String.class),
                @ColumnResult(name="type1desc", type=String.class)
            },
            @ConstrutorResult(targetClass=PropertyClassA.class, columns{
                @ColumnResult(name="type2key", type=String.class),
                @ColumnResult(name="type2desc", type=String.class)
            }
            ...
        }
    }
)

我知道这不是有效的代码,我只是想知道是否有类似的方法这样做。

3b6akqbq

3b6akqbq1#

我认为您正在压缩问题,@constructorresult将按顺序包含这些值,这是查询的输出。我不明白你为什么在上面的代码片段中提到两个@construtorresult。请详细说明这个问题。

bqujaahr

bqujaahr2#

不,这是不可能的。您必须自己在构造函数中构造嵌套对象。
我认为这是blaze持久性实体视图的完美用例。由于blaze持久性支持jpa模型领域中的高级sql概念,因此通常不需要编写本机查询,可以使用blaze持久性实体视图来进行结果Map。
我创建了这个库,以便在jpa模型和自定义接口或抽象类定义的模型之间进行简单的Map,比如spring数据在steroids上的投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过jpql表达式将属性(getter)Map到实体模型。
对于blaze持久性实体视图,用例的dto模型可以如下所示:

@EntityView(EntityClassA.class)
public interface ClassA {
    @IdMapping
    Long getId();
    String getName();
    EntityPropertyClassA getProperty1();
    EntityPropertyClassA getProperty2();

    @EntityView(EntityPropertyClassA.class)
    interface PropertyClassA {
        @IdMapping
        Long getId();
        String getName();
    }
}

查询是将实体视图应用于查询的问题,最简单的就是按id进行查询。 EntityClassA a = entityViewManager.find(entityManager, EntityClassA.class, id); spring数据集成允许您像spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_us/index.html#spring-数据特征

相关问题