0

我有一个名为的类Program,它包含一组文件(和其他基本属性),实现为它自己的类,表示关系模型中ProgramFile的多值复合属性。Program我正在使用带有 Hibernate 的 Spring Boot。

集合的ProgramFile实现如下Program

...
@ElementCollection
@CollectionTable(
        name = "GPI_PROGRAMAS_FICHEROS",
        joinColumns = @JoinColumn(name = "ID_PROGRAMA")
)
private Set<ProgramFile> files;
...

的代码ProgramFile是:

@Embeddable
public class ProgramFile {

    @Column(name = "NOMBRE_FICHERO")
    private @NonNull String fileName;

    @Lob
    @JsonIgnore
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "FICHERO")
    private byte[] file;
}

ProgramFile.file是大型 PDF 文件,我的目标是序列化为ProgramJSON。为了避免 N+1 问题,我使用 @EntityGraph 来提示 Hibernate 只执行一个 SQL 查询来检索所有数据:

@EntityGraph(
        type = EntityGraph.EntityGraphType.LOAD,
        attributePaths = {
                "files"
        }
)
List<Program> findAll(Specification<Program> spec);

我面临的问题是我只对 感兴趣ProgramFile.fileName,而不对ProgramFile.file. 因为后者是大文件,所以 SQL 查询会很慢,我不希望该属性包含在 JSON 中。

问题:有什么方法可以指示 Hibernate 不获取ProgramFile.file或实现 JSON 序列化的替代方法,不包括它?

4

1 回答 1

0

您可以尝试以下解决方案:

  1. 将命名图添加到根实体(程序)
@NamedEntityGraphs({
        @NamedEntityGraph(
                name = "program-without-filecontent",
                attributeNodes = {
                        @NamedAttributeNode(value = "files", subgraph = "program-files")
                },
                subgraphs = {
                        @NamedSubgraph(
                                name = "program-files",
                                attributeNodes = {
                                        @NamedAttributeNode(value = "fileName")
                                }
                        )
                }
        )
})
@Entity
class Program { 
...
  1. 在存储库中使用此命名图:
@EntityGraph(value = "program-without-filecontent", type = EntityGraph.EntityGraphType.LOAD)
List<Program> findAll(Specification<Program> spec);
于 2022-03-03T14:59:22.490 回答