0

我有一个 POJO 映射到特定表中的一行。该行描述了某个站点中的图像,并包含宽度、高度、url、某种状态和更多字段等数据。在一些遗留代码中,我有一个hibernate返回 url 和状态的查询 (in)。这些数据被封装在一个类ImageStatusAndOrigFilename中。

我认为这是一个坏主意,因为:

  1. 如果明天我需要查询其他字段怎么办?名称与数据过于耦合。
  2. 过去获取图像宽度和高度的唯一方法是解析 url。今天我们在数据库中映射宽度和高度,因此我现在需要获取图像大小和状态(我不再关心原始文件名)。所以我需要改变这个类,但不能,因为它正在代码的其他地方使用。我希望得到一些更通用的东西,它不与特定场景耦合,并且可以在需要时进行扩展。

我试图弄清楚要使用哪种数据结构。我是否应该使用具有所有字段但将其中一些字段保留为空的原始 POJO(我不想查询所有字段,因为在这种情况下我不需要所有字段)。我应该为这个特定查询创建另一个 POJO(当然有更好的名称)吗?

当然也欢迎任何其他建议。

编辑

POJO:

@Entity
@Table(name = "web_image")
public class WebImage {
   private long id;

   private Document document;

   private Integer mediaType;

   private Integer width;

   private Integer height;

   private Date creationDate;

   private Date modificationDate;

   private String origUrl;

   private ImageStatus status;

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "id")
   public Long getId() {
      return id;
   }

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "document_id")
   public Document getDocument() {
      return document;
   }

   public void setDocument(final OBDocument document) {
     this.document = document;
   }

   @Column(name = "width")
   public Integer getWidth() {
      return width;
   }

   public void setWidth(final Integer width) {
     this.width = width;
   }

   // Other getters and setters for the rest of the private fields
}

查询:

SELECT b.document_id , b.status , b.orig_file_id, a.min_id 作为 id FROM web_image b, ( SELECT x.document_id, MAX(x.id) max_id, MIN(x.id) min_id FROM web_image x WHERE x.document_id在 ( :docs ) GROUP BY x.document_id) a WHERE a.max_id = b.id

4

2 回答 2

1

那这个呢:

@MappedSuperclass
public class ImageStatusAndOrigFilename {
...
}


@Entity
public class WebImage extends ImageStatusAndOrigFilename {
    ...
}

现在你有了两个类,旧的不是实体,但它的客户对此一无所知,所有的获取和持久化都在WebImage类中,但你可以查询ImageStatusAndOrigFilename.

于 2013-11-07T10:10:05.190 回答
1

如果确实有必要避免加载未使用的列 - 并且您需要分析以确定任何节省是否真的值得 - 那么一个简单的解决方案就是使用 JPA 构造函数表达式编写查询。

JPQL:

http://docs.oracle.com/html/E24396_01/ejb3_langref.html#ejb3_langref_constructor

标准 API:

http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/querycriteria.html#querycriteria-typedquery-multiselect

这些问题是您需要为每组属性添加一个构造函数。

休眠特定选项 - 不需要构造函数:

请参阅 Transformers.aliasToBean:

Java - Hibernate criteria.setResultTransformer() 使用默认值初始化模型字段

对于所有这些选项,您可以使用其他一些 DTO 或使用您现有的实体,即返回一个非托管实例。

延迟加载

您也可以延迟加载字段,但是需要字节码操作:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching-lazyproperties

另请注意以下评论:

Hibernate3 支持对单个属性的惰性获取。这种优化技术也称为提取组。请注意,这主要是一种营销功能;优化行读取比优化列读取重要得多。但是,仅加载类的某些属性在极端情况下可能很有用。

于 2013-11-07T10:57:45.460 回答