@Override
public String convertToDatabaseColumn(ContactInfoType type) {
return conversionHelper.convertToString(type);
}
@Override
public ContactInfoType convertToEntityAttribute(String dbType) {
return conversionHelper.convertToContactInfoType(dbType);
}
}
使用 Date 和 Time 类作为实体属性
Java 8 的 Date 和 Time API 备受期待,许多开发者想要使用这些新类作为实体属性。不幸的是,JPA 2.1 在 Java 8 之前发布,因此不支持这些类。
在 JPA 2.2 发布之前,你有两种方法来持久化 dates 和 times:
例如,实现一个 AttributeConverter,将一个 LocalDate 映射为一个 java.sql.Date。Spring Data 团队和许多其他开发者都是这样做的。
使用持久层框架的一些特性,例如Hibernate 对 Date 和 Time API 的支持。
JPA 2.2 规范现在支持 Date 和 Time API 的一些类作为基础类型,因此你不再需要提供任何额外的映射注解,例如用于 java.util.Date 的@Temporal 注解。相比于过去的 java.util.Date,Date 和 Time API 中的类将简单的日期和带时间的日期区别开来。因此,持久层框架拥有将这些类持久化成相应的 SQL 数据类型而需要的所有信息。
@Entity
public class DateAndTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private LocalDate date;
private LocalDateTime dateTime;
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public LocalDateTime getDateTime() {
return dateTime;
}
public void setDateTime(LocalDateTime dateTime) {
this.dateTime = dateTime;
}
public Long getId() {
return id;
}
}
尽管 JPA 2.2 未支持全部 Date 和 Time API,但是一些实现,例如 Hibernate,会提供更多类的专门支持,例如 java.time.Duration。如果可以在下一个发布版本中加入这些功能会非常棒,但是因为 Oracle 正将所有的规范移交给 Eclipse 基金会,因此我们需要拭目以待。
@NamedQueries({
@NamedQuery(name = EntityWithNamedQueries.findByName,
query = "SELECT e FROM EntityWithNamedQueries e WHERE e.name = :name"),
@NamedQuery(name = EntityWithNamedQueries.findByContent,
query="SELECT e FROM EntityWithNamedQueries e WHERE e.content = :content")
})
public class EntityWithNamedQueries { … }
对于使用多个注解的实体,使用新的注解方式提升了代码的可读性。
@NamedQuery(name = EntityWithMultipleNamedQuery.findByName,
query = "SELECT e FROM EntityWithNamedQueries e WHERE e.name = :name")
@NamedQuery(name = EntityWithMultipleNamedQuery.findByContent,
query = "SELECT e FROM EntityWithNamedQueries e WHERE e.content = :content")
public class EntityWithMultipleNamedQuery { … }
Stream API 是 Java 8 引入的另外一个流行的特性,而且许多开发者想要使用它来处理他们的查询结果。
JPA 2.1 支持的唯一方式是调用 Query 接口的 getResultList 方法,来获取 List 形式的查询结果。然后,你可以调用 List 接口的 stream 方法来获取它的 Stream 形式:
TypedQuery<DateAndTimeEntity> q = em.createQuery(
"SELECT e FROM DateAndTimeEntity e", DateAndTimeEntity.class);
Stream<DateAndTimeEntity> s = q.getResultList().stream();
{1}
TypedQuery<DateAndTimeEntity> q = em.createQuery(
"SELECT e FROM DateAndTimeEntity e", DateAndTimeEntity.class);
Stream<DateAndTimeEntity> s = q.getResultStream();
{1}