繁体   English   中英

jpql不要加载Blob

[英]jpql don't load Blob

@Entity
@NamedQueries({
    @NamedQuery(name = "Item.findAll", query = "select i from Item i"),
})
public class Item implements Serializable, WithId, WithNameDescription {
    @Lob
    byte[] photo;
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    TextualInfo english = new TextualInfo();
// more entry field, getters and setters
}

当我调用Query Item.findAll ,我假设所有bytes []都进入了内存。 但是我不会用。 所以我不想拿它。 有没有一种方法,如何指定我要在jpql查询中延迟加载照片的事实

在EclipseLink中,您可以使用FetchGroups进行控制。 要使用它,请在实体类的顶部添加EclipseLink的特定FetchGroup批注,如下所示:

@Entity
@Table(name="person")
@FetchGroup(name="personWithNoBlobs",attributes={@FetchAttribute(name="firstName"),@FetchAttribute(name="lastName"),@FetchAttribute(name="address")})
public class Person

需要启用编织,或者您的Entity类需要实现EclipseLink提供的FetchGroupTracker接口。 要在JPQL中使用提取组,请使用以下命令:

query.setHint(QueryHints.FETCH_GROUP_NAME, "personWithNoBlobs");

默认情况下,持久性属性会急切加载,您无法从JPQL中进行控制。 但是,您可以尝试更改默认行为,并使用Basic注释使photo懒。 根据JPA规范:

9.1.18基本注释

基本注释是映射到数据库列的最简单的类型。 基本注释可以应用于以下任何类型的持久属性或实例变量:Java基本类型,基本类型的包装,java.lang.String,java.math.BigInteger,java.math.BigDecimal,java。 util.Date,java.util.Calendar,java.sql.Date,java.sql.Time,java.sql.Timestamp,byte [],Byte [],char [],Character [],枚举和任何其他类型实现Serializable。 如2.1.6节所述,对于这些类型的持久字段和属性,基本注释的使用是可选的。

 @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface Basic { FetchType fetch() default EAGER; boolean optional() default true; 

FetchType枚举定义了从数据库中获取数据的策略:

 public enum FetchType { LAZY, EAGER }; 

EAGER策略是对持久性提供程序运行时的要求,必须热切地获取数据。 LAZY策略向持久性提供程序运行时提供了提示 ,即首次访问数据时应延迟获取数据。 该实现被允许急切地获取已为其指定LAZY策略提示的数据。 特别是,懒惰获取可能仅适用于使用基于属性的访问的Basic映射。

像这样:

@Lob @Basic(fetch=LAZY)
public byte[] getPhoto() { return photo; }

但是,正如规范中所述,这只是一个提示,可能不受支持。 在这种情况下,一种替代方法是与另一个实体(保存Blob)一起使用延迟加载的强制性一对一关联。

参考文献

  • JPA 1.0规范
    • 第9.1.18节“基本注释”
    • 第9.1.19节“ Lob注释”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM