У меня есть объект Instrument
с этими полями:
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(referencedColumnName = "instrumentId", nullable = false)
public Set<InstrumentSymbol> getSymbols() {
return this.symbols;
}
@Column
@JsonProperty("statusCode")
public Integer getStatusCode() {
return statusCode;
}
InstrumentSymbol
теперь имеет в базе данных столбец с именем symbold_instrumentId
, который Hibernate автоматически создает, но с ним не связано ни одно свойство. Как я могу найти все InstrumentSymbol
, где statusCode
равно 1
?
Я пытался
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<InstrumentSymbol> query = builder.createQuery(InstrumentSymbol.class);
Root<InstrumentSymbol> rootSymbol = query.from(InstrumentSymbol.class);
Subquery<Long> subquery = query.subquery(Long.class);
Root<Instrument> rootInstrument = subquery.from(Instrument.class);
subquery.select(rootInstrument.get(Instrument_.instrumentId));
subquery.where(builder.equal(rootInstrument.get(Instrument_.statusCode), 1));
query.where(builder.in(rootSymbol.get("symbols_instrumentId")).in(subquery)); // <--- Fails here
, но это не удается с
java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [symbols_instrumentId] on this ManagedType [....InstrumentSymbol]
Затем я пытался чтобы добавить настраиваемое поле к моему @StaticMetamodel
:
public static volatile SingularAttribute<InstrumentSymbol, Long> symbols_instrumentId; // NOSONAR Hibernate 5 requires this
, но, к сожалению, Hibernate игнорирует его:
// Hibernate fills these fields for me
assertEquals("Instrument#instrumentId(BASIC)", Instrument_.instrumentId.toString());
assertEquals("InstrumentSymbol#instrumentSymbolId(BASIC)", InstrumentSymbol_.instrumentSymbolId.toString());
// But not this...
assertEquals(null, InstrumentSymbol_.symbols_instrumentId);
Как создать запрос, который работает?
Для справки: метаданные * * * * * * * * * * * * * * * * * * *
* * (нет столбца с FK Instrument
). Это автоматически сгенерированный DDL:
create table InstrumentSymbol (
instrumentSymbolId int8 not null,
externalInstrumentSymbolId varchar(50) not null,
symbol varchar(40) not null,
symbolType varchar(20) not null,
symbols_instrumentId int8 not null, /* Additional column, not visible from Java */
primary key (instrumentSymbolId)
);
alter table InstrumentSymbol
add constraint FKcb138lkaiji2wh11275m77byk
foreign key (symbols_instrumentId)
references Instrument;