[英]Spring boot extracting limited fields from a model
我正在使用 JPA,下面是我的 AssetItem Dto。 在 assetItemDocsCollection 中,我正在尝试获取 Collection。 但我不想要 AssetItemDocs 中的所有字段。 例如,我不想要 documentByte,因为这个字段会很大。 我只希望所有字段都离开该字段,我怎样才能用更少的代码做到这一点。
public class AssetItemDto extends AbstractDto<Long> {
private Collection<AssetItemDocs> assetItemDocsCollection;
}
public class AssetItemDocs implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@Lob
@Column(name = "document_byte")
private byte[] documentByte;
@Column(name = "creation_date")
@Temporal(TemporalType.DATE)
private Date creationDate;
@JoinColumn(name = "asset_item_id", referencedColumnName = "id")
@ManyToOne
private AssetItem assetItemId;
}
这通常是进行投影的目的:仅检索实体的部分属性。 有几种方法可以做到这一点,例如:
不要在 DTO 的Collection
中AssetItemDocs
实体,而是创建另一个 DTO,其中包含要获取的AssetItemDocs
的所有字段(除了documentByte
之外的所有字段)。 该 DTO 必须有一个将所有这些字段作为参数的构造函数(类型和名称必须与实体中声明的相匹配)。
然后在您的存储库中,编写一个查询方法,其返回类型是该 DTO 的Collection
。 如果您的查询可通过其方法名称派生,它将按原样工作,但如果您的方法是使用@Query
注释中的 JPQL 查询编写的,则需要在select
原因中使用这种方式显式调用 DTO 构造函数语法: SELECT new full.package.MyDTO(entity.attribute1, entity.attribute2) FROM MyEntity entity
。
然后,您只需将存储库返回的Collection
包含在您的AssetItemDto
中。
注意:虽然可以使用相同的实体类而不是新的 DTO 进行投影,但我个人认为在 DTO 中公开实体对象是一种不好的做法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.