у меня есть:
Объект Request
имеет коллекцию Stage
с, а каждый этап имеет коллекцию StageItem
с. Элементы сцены могут быть нескольких типов, и я использую их для JPA / Hibernate SINGLE_TABLE
в качестве стратегии наследования со столбцом дискриминатора.
Мне нужен мой запрос lucene для возврата запросов, которые содержат конкретную деталь в элементе стадии типа A (поле aDetail
в классе StageItemA
). Я не могу получить поиск в спящем режиме, чтобы увидеть поле aDetail
в подклассе StageItemA
.
Так что этот запрос lucene не работает (возвращает 0 результатов):
stages.stageItems.aDetail:blah
Но поиск по полям в StageItem
работает:
stages.stageItems.comment:yuppie
Используя Люка, я могу заполнять поля из StageItem
, например stages.stageItems.comment
, но без полей из StageItemA
, например stages.stageItems.aDetail
.
Определения сущностей:
@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;
//...
}