I have a Request
entity which has a collection of Stage
s and each stage has a collection of StageIitem
s. Stage items can be of several types and I use in JPA/Hibernate SINGLE_TABLE
as inheritance strategy with a discriminator column.
I need my query to return requests that have particular detail in a stage item of type A (field aDetail
in class StageItemA
). I cannot get the lucene query to see the field aDetail
in StageItemA
.
So this lucene query does not work (returns 0 results):
stages.stageItems.aDetail:blah
But searching based on fields in the base class StageItem
works:
stages.stageItems.comment:yuppie
Using Luke, I can the fields from StageItem
, like stages.stageItems.comment
, but no field from StageItemA
, like stages.stageItems.aDetail
.
Entities:
@Entity @Table(name = "REQUEST") @Indexed(index = "RequestIndex") class Request implements Serializable { //... @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) @MapKeyColumn(name = "type", length = 50, nullable = false) @JoinTable( name = "REQUEST_STAGE", joinColumns = @JoinColumn(name = "REQUEST_ID", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "STAGE_ID", referencedColumnName = "id") ) @IndexedEmbedded private Map<String, Stage> stages = new HashMap<>(); //... } @Entity @Table(name = "STAGE") public class Stage implements Serializable { //... @OneToMany(fetch = FetchType.EAGER, targetEntity = StageItem.class, cascade = { CascadeType.ALL, }, orphanRemoval = true) @JoinTable( name = "STAGE_TO_STAGE_ITEM", joinColumns = @JoinColumn(name = "STAGE_ID"), inverseJoinColumns = @JoinColumn(name = "STAGE_ITEM_ID") ) @Fetch(FetchMode.JOIN) @IndexedEmbedded private Set<StageItem> stageItems = new HashSet<>(); //... } @Entity @Table(name = "STAGE_ITEM") @DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING) @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public abstract class StageItem implements Serializable { //... @Column(name = "TYPE") @Field protected String type; @Column(name="COMMENT") @Field protected String comment; //... } @Entity @DiscriminatorValue(value = "A") public class StageItemA extends StageItem { //... @Column(name="A_DETAIL") @Field private String aDetail; //... }