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控制的。我澄清了我的答案。