Я пытаюсь реализовать запрос критериев Hibernate, который возвращает сущность на основе параметров, которые ссылаются на несколько других таблиц, которые не имеют прямого отношения к моей сущности, и я не знаю, как выполнить sh эту задачу. Следующие мои объекты:
@Entity
class User {
@Id
private long id;
}
@Entity
class Device {
@Id
private long id;
}
@Entity
class Configuration {
@Id
private long id;
@ManyToOne
private User user;
@ManyToOne
private Device device;
@OneToMany(mappedBy = "id.configuration")
private Set<ConfigurationOverride> configurationOverrides;
}
@Entity
class Part {
@Id
private long id;
}
@Entity
class ConfigurationOverride {
@EmbeddedId
private Id id;
private String property;
@Embeddable
class Id {
@ManyToOne
@JoinColumn(referencedColumnName = "id")
private Configuration configuration;
@ManyToOne
@JoinColumn(referencedColumnName = "id")
private Part part;
}
}
Теперь я хочу найти ConfigurationOverride
, где id.configuration.user.id = ...
, id.configuration.device.id is null
и id.part.id = ...
. По сути, что-то вроде следующего SQL:
SELECT co.property
FROM configuration_override co
INNER JOIN configuration c
ON co.configuration_id = c.id
INNER JOIN User u
ON c.user_id = u.id
INNER JOIN part p
ON co.part_id = p.id
WHERE u.id = 12345
AND c.device_id IS NULL
Я пытался создать следующие критерии, но он не работает:
session.createCriteria(ConfigurationOverride.class)
.createAlias("id.configuration.user", "user")
.createAlias("id.configuration.device", "device")
.createAlias("id.part", "part")
.add(Restrictions.eq("part.id", partId))
.add(Restrictions.eq("user.id", userId))
.add(Restrictions.eqOrIsNull("device.id", deviceId))
.uniqueResult();
Это приводит к следующему исключению:
org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "user1_"
Position: 209
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143)
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:106)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)
... 130 common frames omitted
Wrapped by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2116)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1899)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1875)
at org.hibernate.loader.Loader.doQuery(Loader.java:919)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
at org.hibernate.loader.Loader.doList(Loader.java:2611)
at org.hibernate.loader.Loader.doList(Loader.java:2594)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423)
at org.hibernate.loader.Loader.list(Loader.java:2418)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1705)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:363)
at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:385)
...
Я использую Hibernate версии 5.0.1.Final.
Кто-нибудь может подсказать, как это правильно сделать?