Как создать критерии гибернации для нескольких объектов - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь реализовать запрос критериев 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.

Кто-нибудь может подсказать, как это правильно сделать?

...