[英]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)一起使用延迟加载的强制性一对一关联。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.