JPA鉴别器字段上的Spring-Data Pageable排序

时间:2017-05-15 08:01:26

标签: hibernate jpa spring-data spring-data-jpa

我有一个JPA实体层次结构,JPA加入了继承:

@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING)
Product

@Entity
@Table(name = "product_quiz")
@DiscriminatorValue("quiz")
public class QuizProduct extends Product

我想使用QueryByExample和PageRequest运行一个spring-data查询,如下所示:

Example<Product> example = ...
PageRequest pageRequest = ...
Page<Product> productPage = productRepository.findAll(example, pageRequest);

它工作正常,除非我将sortField的{​​{1}}设置为“类型”(pageRequest)。

我试过:

  • 直接将类型字段添加到实体。这样查询运行正常,但持久化操作失败并显示@DiscriminatorColumn
  • 如果我将此字段标记为org.postgresql.util.PSQLException: The column index is out of range: 11, number of columns: 10,则持久有效,但查询会给我这个例外:@Transient(AbstractEntityWithDate是Unable to locate Attribute with the the given name [type] on this ManagedType [...AbstractEntityWithDate]的{​​{1}},其中包含@MappedSuperclassProduct

我正在使用spring-boot版本1.4.5.RELEASE和依赖管理版本的spring-data-jpa(1.10.8.RELEASE)和hibernate(5.0.12.Final)。

如何通过creationDate的鉴别器字段配置排序? (我不想为此编写自定义modificationDate

1 个答案:

答案 0 :(得分:5)

  

Discriminator列可以映射为只读实体属性

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING)
class Product {
  @Column(name = "TYPE", insertable = false, updatable = false)
  private String type;
}

然后,以下查询将起作用:

productRepository.findAll(new Sort("type"))

可用的工作样本on Github

说到这一点,尝试在代码中使用继承策略JOINED的鉴别器值将不适用于Hibernate(type将永远是null)。这是因为传统上Hibernate不支持@DiscriminatorColumn JOINED(请参阅HHH-6911),并且仅开始使用v4.2.9开始保存连接继承的列值。似乎仍有一个错误没有读取鉴别器列值,即使该值保存正确。