spring数据jpa项目,如何限制嵌套对象的数量@单亲

laawzig2  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(297)

我在做一个小的springrestapi项目。我有两个类,它们表示数据库中的两个表。我在要从中检索数据的对象中有一个@onetomanyMap。现在我检索所有嵌套对象,但是我想要的是能够通过int datestamp变量(在我的类中是一个声明为“utcs”的历元)限制嵌套对象的数量。我天真地认为,粗糙的政策可以帮助我,但现在我明白我错了。我希望能够在我的存储库中执行以下操作:

@Repository
public interface TypeRepository extends CrudRepository<Type, Integer> {
    List<Type> findByDataUtcsGreaterThan(int utcs);
}

这就是我想要的json结构,以及它现在的样子。但是如何限制数据对象的数量呢?

[
    {
        "typeKey": "Queue",
        "uomId": 1,
        "data": [
            {
                "value": 11,
                "utcs": 1605840300
            },
            {
                "value": 15,
                "utcs": 1605840360
            },
            {
                "value": 22,
                "utcs": 1605840420
            }
        ]
    },
    {
        "typeKey": "Unroutable",
        "uomId": 1,
        "data": [
            {
                "value": 196,
                "utcs": 1605840300
            },
            {
                "value": 196,
                "utcs": 1605840360
            },
            {
                "value": 196,
                "utcs": 1605840420
            }
        ]
    }
]

具有嵌套对象@onetomany的(type)对象类

@Entity
@Table(name = "SYSTEMSTATSTYPE")
public class Type {
    @Id
    @Column(name = "ID")
    private int id;
    @Column(name = "TYPEKEY")
    private String typeKey;
    @Column(name = "UOMID")
    private int uomId;

    @OneToMany(mappedBy = "type", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Data> data = new ArrayList<>();

    public Type() {
        super();
    }

    public Type(String typeKey, int uomId) {
        this.typeKey = typeKey;
        this.uomId = uomId;
    }

    // Getters and setters
}

(数据)对象类@manytone

@Entity
@Table(name = "SYSTEMSTATSDATA")
public class Data {
    @Id
    @Column(name = "ID")
    private int id;
    @Column(name = "VALUE")
    private int value;
    @Column(name = "UTCS")
    private int utcs;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "TYPEID")
    private Type type;

    public Data() {
        super();
    }

    public Data(int value, int utcs, Type type) {
        super();
        this.value = value;
        this.utcs = utcs;
        this.type = type;
    }
    // Getters and setters
}
iyfamqjs

iyfamqjs1#

这是不可能的。您可以为每个 Type 对象,或者可以使用类似blaze persistence实体视图的东西,该视图具有限制集合元素的本机支持。
我创建了这个库,以便在jpa模型和自定义接口或抽象类定义的模型之间进行简单的Map,比如spring数据在steroids上的投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过jpql表达式将属性(getter)Map到实体模型。
对于blaze持久性实体视图,用例的dto模型可以如下所示:

@EntityView(Type.class)
public interface TypeDto {
    @IdMapping
    Integer getId();
    String getTypeKey();
    int getUomId();
    @Limit(limit = "5", order = "utcs DESC")
    Set<DataDto> getData();

    @EntityView(Data.class)
    interface DataDto {
        @IdMapping
        Integer getId();
        int getValue();
        int getUtcs();
    }
}

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

@Repository
public interface TypeRepository extends CrudRepository<Type, Integer> {
    List<TypeDto> findByDataUtcsGreaterThan(int utcs);
}
beq87vna

beq87vna2#

我不认为直接使用注解是有可能的,而且在大多数情况下,使用急切获取也不是一个好主意。我认为您必须自己用一个自定义查询来构建逻辑,或者只获取2个数据对象(如这里所述)https://www.baeldung.com/jpa-limit-query-results),或一个连接,让您可以立即输入数据。

相关问题