Java jpql don';t负载水滴
当我调用查询Java jpql don';t负载水滴,java,orm,jpa,lazy-loading,blob,Java,Orm,Jpa,Lazy Loading,Blob,当我调用查询Item.findAll时,我假设所有字节[]都进入内存。但我不会用它。所以我不想去拿。有没有办法,如何指定我希望在jpql查询中惰性地加载照片的事实?默认情况下,持久性属性是急切地加载的,您无法从jpql控制这一点。但是,您可以尝试更改默认行为,并使用Basic注释使photo变懒。根据JPA规范: 9.1.18基本注释 基本注释是最简单的 映射到数据库列的类型。 基本注释可以应用于 持久属性或实例 以下任何一项的变量 类型:Java基本类型、包装器 在原始类型中, java.la
Item.findAll
时,我假设所有字节[]都进入内存。但我不会用它。所以我不想去拿。有没有办法,如何指定我希望在jpql查询中惰性地加载照片的事实?默认情况下,持久性属性是急切地加载的,您无法从jpql控制这一点。但是,您可以尝试更改默认行为,并使用Basic
注释使photo
变懒。根据JPA规范:
9.1.18基本注释
基本注释是最简单的
映射到数据库列的类型。
基本注释可以应用于
持久属性或实例
以下任何一项的变量
类型:Java基本类型、包装器
在原始类型中,
java.lang.String,
java.math.biginger,
java.math.BigDecimal、java.util.Date、,
java.util.Calendar、java.sql.Date、,
java.sql.Time,java.sql.Timestamp,
字节[],字节[],字符[],字符[],
枚举,以及任何其他
实现可序列化。如上所述
在第2.1.6节中,基本
注释对于持久化是可选的
这些类型的字段和属性
@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
}
FetchType
enum定义
从数据库获取数据的策略
数据库:
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Basic {
FetchType fetch() default EAGER;
boolean optional() default true;
迫切的策略是一项要求
关于持久性提供程序运行时
必须急切地获取这些数据。这个
LAZY
策略是对
持久性提供程序运行时会删除该数据
当它是
第一次访问。实施过程非常简单
允许急切地获取数据以供
LAZY
策略提示中包含的
已指定。尤其是懒惰
抓取可能仅适用于
基本映射
使用基于属性的访问
大概是这样的:
public enum FetchType { LAZY, EAGER };
@Lob @Basic(fetch=LAZY)
public byte[] getPhoto() { return photo; }
但正如规范中提到的,这只是一个提示,可能不受支持。在这种情况下,另一种选择是使用延迟加载的强制与另一个实体(持有blob)的一对一关联
工具书类
- JPA1.0规范
- 第9.1.18节“基本注释”
- 第9.1.19节“Lob注释”
默认情况下,持久性属性是急切地加载的,您无法从JPQL控制它。但是,您可以尝试更改默认行为,并使用Basic
注释使photo
变懒。根据JPA规范:
9.1.18基本注释
基本注释是最简单的
映射到数据库列的类型。
基本注释可以应用于
持久属性或实例
以下任何一项的变量
类型:Java基本类型、包装器
在原始类型中,
java.lang.String,
java.math.biginger,
java.math.BigDecimal、java.util.Date、,
java.util.Calendar、java.sql.Date、,
java.sql.Time,java.sql.Timestamp,
字节[],字节[],字符[],字符[],
枚举,以及任何其他
实现可序列化。如上所述
在第2.1.6节中,基本
注释对于持久化是可选的
这些类型的字段和属性
@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
}
FetchType
enum定义
从数据库获取数据的策略
数据库:
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Basic {
FetchType fetch() default EAGER;
boolean optional() default true;
迫切的
策略是一项要求
关于持久性提供程序运行时
必须急切地获取这些数据。这个
LAZY
策略是对
持久性提供程序运行时会删除该数据
当它是
第一次访问。实施过程非常简单
允许急切地获取数据以供
LAZY
策略提示中包含的
已指定。尤其是懒惰
抓取可能仅适用于
基本映射
使用基于属性的访问
大概是这样的:
public enum FetchType { LAZY, EAGER };
@Lob @Basic(fetch=LAZY)
public byte[] getPhoto() { return photo; }
但正如规范中提到的,这只是一个提示,可能不受支持。在这种情况下,另一种选择是使用延迟加载的强制与另一个实体(持有blob)的一对一关联
工具书类
- JPA1.0规范
- 第9.1.18节“基本注释”
- 第9.1.19节“Lob注释”
在EclipseLink中,您可以使用FetchGroups进行控制。要使用它,请在entity类的顶部添加EclipseLink特定的FetchGroup
注释,如下所示:
public enum FetchType { LAZY, EAGER };
@Lob @Basic(fetch=LAZY)
public byte[] getPhoto() { return photo; }
要么需要启用编织,要么您的实体类需要实现EclipseLink提供的FetchGroupTracker
接口。要在JPQL中使用fetch组,请使用以下命令:
@Entity
@Table(name="person")
@FetchGroup(name="personWithNoBlobs",attributes={@FetchAttribute(name="firstName"),@FetchAttribute(name="lastName"),@FetchAttribute(name="address")})
public class Person
在EclipseLink中,您可以使用FetchGroups来控制它。要使用它,请在entity类的顶部添加EclipseLink特定的FetchGroup
注释,如下所示:
public enum FetchType { LAZY, EAGER };
@Lob @Basic(fetch=LAZY)
public byte[] getPhoto() { return photo; }
要么需要启用编织,要么您的实体类需要实现EclipseLink提供的FetchGroupTracker
接口。要在JPQL中使用fetch组,请使用以下命令:
@Entity
@Table(name="person")
@FetchGroup(name="personWithNoBlobs",attributes={@FetchAttribute(name="firstName"),@FetchAttribute(name="lastName"),@FetchAttribute(name="address")})
public class Person
所以基本上,使用jpql是不可能的?不,如果不修改代码,这是不可能的,这不是您可以从jpql控制的。我澄清了我的答案。所以基本上,使用jpql是不可能的?@coubatcheck不,如果不修改代码,这是不可能的,这是无法从jpql控制的。我澄清了我的答案。