【问题标题】:Spring Data + JPA how to avoid loading a columnSpring Data + JPA 如何避免加载列
【发布时间】:2015-03-02 14:50:42
【问题描述】:

我有一个包含 6 列的表,其中一个是 CLOB 列,在搜索此表期间我不想带此列数据,但是当用户请求详细信息然后加载它时,我如何实现这与 Spring Data JPA 一起,我尝试在没有帮助的情况下使用 Projections + MetaModel Object

【问题讨论】:

  • 尝试使用@Basic(fetch=FetchType.LAZY)注释字段
  • 我有它,但我在 Web 层进行了从实体对象到资源对象的转换,所以我该如何避免它
  • 不要为该字段调用 getter,因为这样做会触发查询以获取 CLOB 数据。另请注意,这可能不起作用,不同的 JPA 实现以不同的方式处理此问题。
  • 我正在使用 ResourceAssembler 的 OrderResource toResource(Order entity),因为该方法用于 Details 调用和 Query,这里我必须调用 getter

标签: spring-data-jpa


【解决方案1】:

我通过将两列移动到一个单独的表中来做到这一点,但即使您无法触及数据库,您也始终可以将两个不同的实体映射到同一个表的不同列。

重量级子实体:

@Entity
public class RawImage implements Serializable {
    // other properties
    private String type;
    private byte[] data;
}

轻量级父实体:

@Entity
public class Model implements Serializable {
    // other properties (ID etc.)

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fk_image_id")
    private RawImage image;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fk_thumb_id")
    private RawImage thumb;
}

这意味着默认情况下不加载图像/拇指数据,当我确实需要它们时,我只是添加了一个提取,如下所示:

String jpql = "select m from Model m join fetch m.image i";

other techniques described in this answer,但它们并不像我认为的这个简单的解决方案那样干净。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2015-04-29
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多