我有一个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}},其中包含@MappedSuperclass
和Product
)我正在使用spring-boot版本1.4.5.RELEASE和依赖管理版本的spring-data-jpa(1.10.8.RELEASE)和hibernate(5.0.12.Final)。
如何通过creationDate
的鉴别器字段配置排序? (我不想为此编写自定义modificationDate
。
答案 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开始保存连接继承的列值。似乎仍有一个错误没有读取鉴别器列值,即使该值保存正确。