JPA注解详解(三)
?
@ColumnResult
执行 @NamedNativeQuery 时,它可以返回实体(包括不同类型的实体)、标量值或实体和标量值的组合。
使用 @ColumnResult 批注返回标量值。标量类型由您在 @ColumnResult 中标识的列类型确定。
有关详细信息,另请参阅 @EntityResult、@FieldResult 和 @SqlResultSetMapping。
表 1-8 列出了此批注的属性。有关更多详细信息,请参阅 API。
表 1-8 @ColumnResult 属性
属性
必需
说明
name
?
在原生 SQL 查询的 SELECT 语句中将 name 设置为列名的 String 等效形式。如果在 SELECT 中使用列别名(AS 语句),则将 name 设置为列别名。
?
示例 1-9 显示了如何使用此批注将 Item(请参阅示例 1-10)标量name 包含在结果列表(请参阅示例 1-11)中。在该示例中,结果列表将为Object 数组的 List,如:{[Order, "Shoes"],[Order, "Socks"], ...}。
示例 1-9 使用 @ColumnResult 的 Order 实体
@SqlResultSetMapping(
name="OrderResults",
entities={
@EntityResult(
entityClass=Order.class,
fields={
@FieldResult(name="id",??????column="order_id"),
@FieldResult(name="quantity", column="order_quantity"),
@FieldResult(name="item",????column="order_item")
??????????? }
??????? )
??? },
columns={
@ColumnResult(
name="item_name"
??????? )
??? }
)
@Entity
public class Order {
@Id
protected int id;
protected long quantity;
protected Item item;
??? ...
}
示例 1-10 Item 实体
@Entity
public class Item {
@Id
protected int id;
protected String name;
??? ...
}
示例 1-11 结合使用 @SqlResultSetMapping与 @ColumnResult 的原生查询
Query q = entityManager.createNativeQuery(
"SELECT o.id?????? AS order_id," +
"o.quantity AS order_quantity, " +
"o.item???? AS order_item, " +
"i.name???? AS item_name, " +
"FROM Order o, Item i " +
"WHERE (order_quantity > 25) AND (order_item = i.id)",
"OrderResults"
);
List resultList = q.getResultList();
// List of Object arrays:{[Order, "Shoes"], [Order,"Socks"], ...}
@DiscriminatorColumn
默认情况下,当 @Inheritance 属性策略为 InheritanceType.SINGLE_TABLE 或 JOINED 时,JPA 持续性提供程序将创建一个名为DTYPE 的标识符列以区分继承层次中的类。
使用 @DiscriminatorColumn 批注:
表 1-9 列出了此批注的属性。有关更多详细信息,请参阅 API。
表 1-9 @DiscriminatorColumn 属性
属性
必需
说明
columnDefinition
?
默认值:空 String。
默认情况下,JPA 持续性提供程序使用最少量 SQL 创建一个数据库表列。
如果需要使用更多指定选项创建的列,请将 columnDefinition 设置为在针对列生成 DDL 时希望 JPA 使用的 SQL 片断。
discriminatorType
?
默认值:DiscriminatorType.STRING。
默认情况下,JPA 持续性提供程序假设标识符类型为 String。
如果要使用其他类型,请将 discriminatorType 设置为 DiscriminatorType.CHAR 或 DiscriminatorType.INTEGER。
您的 @DiscriminatorValue 必须符合此类型。
length
?
默认值: 31
默认情况下,JPA 持续性提供程序假设标识符列在用于保存 String 值时的最大长度为 255 个字符。
如果该列不适合于您的应用程序或数据库,请将 length 设置为适合于您的数据库列的 int 值。
您的 @DiscriminatorValue 必须符合此长度。
name
?
默认值:JPA 持续性提供程序假设标识符列名为“DTYPE”。
要指定其他列名,请将 name 设置为所需的 String 列名。
?
示例 1-12 显示了如何使用此批注指定一个名为 DISC、类型为 STRING、长度为 20 的标识符列。在本示例中,该类的 @DiscriminatorValue 指定为 CUST。示例 1-13 中的子类将它自己的@DiscriminatorValue 指定为 VIP。在 Customer 和 ValuedCustomer 中,@DiscriminatorValue 的值必须可以转换为由 @DiscriminatorColumn 属性 discriminatorType 指定的类型,并且必须符合 @DiscriminatorColumn 属性 length。
示例 1-12 @DiscriminatorColumn 和@DiscriminatorValue — 根类
@Entity
@Table(name="CUST")
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="DISC", discriminatorType=STRING,length=20)
@DiscriminatorValue(value-"CUST")
public class Customer {
??? ...
}
示例 1-13 @DiscriminatorValue — 子类
@Entity
@DiscriminatorValue(value="VIP")
public class ValuedCustomer extends Customer {
??? ...
}
@DiscriminatorValue
默认情况下,当 @Inheritance 属性策略为 InheritanceType.SINGLE_TABLE 或 JOINED 时,JPA 持续性提供程序使用@DiscriminatorColumn 按实体名称区分继承层次中的类(请参阅 @Entity)。
使用 @DiscriminatorValue 批注指定用于区分此继承层次中的实体的标识符值:
表 1-10 列出了此批注的属性。有关更多详细信息,请参阅 API。
表 1-10 @DiscriminatorValue 属性
属性
必需
说明
value
?
将 value 设置为符合 @DiscriminatorColumn 属性 discriminatorType 和 length 的标识符值的 String 等效形式。
?
示例 1-14 显示了如何使用此批注指定一个名为 DISC、类型为 STRING、长度为 20 的标识符列。在本示例中,该类的 @DiscriminatorValue 指定为 CUST。示例 1-15 中的子类将它自己的@DiscriminatorValue 指定为 VIP。在 Customer 和 ValuedCustomer 中,@DiscriminatorValue 的值必须可以转换为由 @DiscriminatorColumn 属性 discriminatorType 指定的类型,并且必须符合 @DiscriminatorColumn 属性 length。
示例 1-14 @DiscriminatorColumn 和@DiscriminatorValue — 根类
@Entity
@Table(name="CUST")
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="DISC", discriminatorType=STRING,length=20)
@DiscriminatorValue(value-"CUST")
public class Customer {
??? ...
}
示例 1-15 @DiscriminatorValue — 子类
@Entity
@DiscriminatorValue(value="VIP")
public class ValuedCustomer extends Customer {
??? ...
}
@Embeddable
默认情况下,JPA 持续性提供程序假设每个实体均持久保存到它自己的数据库表。
使用 @Embeddable 批注指定一个类,该类的实例存储为拥有实体的固有部分并共享该实体的身份。嵌入对象的每个持久属性或字段都将映射到实体的数据库表。
此批注没有属性。有关更多详细信息,请参阅API。
示例 1-16 显示了如何使用此批注指定:类 EmploymentPeriod 在用作批注为 @Embedded 的持久字段的类型时可以嵌套到实体中(请参阅示例 1-17)
示例 1-16 @Embeddable
@Embeddable
public class EmploymentPeriod {
java.util.Date startDate;
java.util.Date endDate;
??? ...
}