在使用JPQL或标准API省略某些字段的同时恢复具有相关实体的实体列表

问题描述 投票:0回答:1

我有三个实体:A,B,C

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

@Entity
public class A {

    private long id;

    private String secret;

    @Builder.Default
    @Valid
    @OneToMany(mappedBy = "a", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<B> bList = new LinkedList<>();

}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

@Entity
public class B {

    @JoinColumn
    private A a;

    private long id;

    private String secret;

    @Builder.Default
    @Valid
    @OneToMany(mappedBy = "b", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<C> cList = new LinkedList<>();

}


@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

@Entity
public class C {

    @JoinColumn
    private B b;

    private long id;

    private String secret;
}

我想从数据库EXCEPT中恢复值,其中A的ID属于ID列表。 我不希望从DB请求A,B或C的秘密。 (实际上,数据要复杂得多,我不想从数据库中获取太多时间的字段)。

我一直在尝试使用JPQL或Criteria API创建这样的查询,但是没有成功,没有秘密我什至无法获得B的列表。

例如,在JPQL中:

        Query query = entityManager.createQuery
                ("SELECT a  " +
                        "FROM A a where a.id in :aIds");
        query.setParameter("aIds", aIds);

这将起作用,但不幸的是,它还要求提供A,B和C的秘密。

我想要的是类似的东西(此代码显然不起作用:]:>

        Query query = entityManager.createQuery
                ("SELECT a.id, a.bList.id, a.bList.cList.id" +
                        "FROM A a where a.id in :aIds");
        query.setParameter("aIds", aIds);

我无法更改实体(除了添加新的构造函数或方法之外,因为它们在其他地方和其他查询中使用。

甚至有可能吗?

我有三个实体:A,B,C @Data @Builder @NoArgsConstructor @AllArgsConstructor @Entity公共类A {私有长id;私有字符串秘密; @ Builder.Default @Valid @ ...

java jpql criteria-api
1个回答
0
投票

您可以使用所需字段创建dto类并进行填充。问题在于数据库查询只能返回纯结果。持久性提供程序仅对实体进行处理。至于dto,您必须自己解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.