Spring Hibernate «не может разрешить свойство» в пользовательском @Query с внутренним объединением в @ManyToMany @JoinTable - PullRequest
0 голосов
/ 30 октября 2019

У меня есть такой класс:

@Entity(name = "LP_TEMPLATE")
public class LpTemplate {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false, updatable = false)
    private Long id;

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(name = "TEMPLATE_APPS",
        inverseJoinColumns = { @JoinColumn(name = "appId") },
        joinColumns = { @JoinColumn(name = "templateId") })
    private Set<LpApp> apps = new HashSet<>();

    ...

}

, и я пытаюсь написать метод в хранилище, чтобы получить все экземпляры LpTemplate для данного appId. По сути это обратное отображение @ManyToMany.

@Repository
public interface LpTemplateRepository extends JpaRepository<LpTemplate, Long> {

    @Query("select T from LP_TEMPLATE as T inner join T.apps as TA on T.id = TA.templateId AND TA.appId = ?1")
    List<LpTemplate> findTemplatesWithApp(long appId);

}

Однако при запуске я получаю исключение: не удалось разрешить свойство: templateId of: test.LpApp

Вот полная трассировка стека:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: could not resolve property: templateId of: test.LpApp [select T from test.LpTemplate as T inner join T.apps as TA on T.id = TA.templateId AND TA.appId = ?1]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:277) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:611) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:720) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    ... 72 common frames omitted

Моя предыдущая версия (которая также не работала кстати) была такой:

@Repository
public interface LpTemplateRepository extends JpaRepository<LpTemplate, Long> {

    @Query("select T from LP_TEMPLATE as T inner join TEMPLATE_APPS as TA on T.id = TA.templateId AND TA.appId = ?1")
    List<LpTemplate> findTemplatesWithApp(long appId);

}

И здесь я получил исключение: Ожидается путь для присоединения!

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [select T from test.LpTemplate as T inner join TEMPLATE_APPS as TA on T.id = TA.templateId AND TA.appId = ?1]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:277) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:611) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:720) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
    ... 72 common frames omitted

Что я здесь не так делаю? Заранее спасибо.

1 Ответ

0 голосов
/ 30 октября 2019

Вы получаете ошибку,

Причина: org.hibernate.hql.internal.ast.QuerySyntaxException: не удалось разрешить свойство: templateId of: test.LpApp

Это означает, что вы ссылаетесь на столбец (свойство) в LpApp классе с templateId, которого в нем нет. Убедитесь, что вы определили или пометили свойство в LpApp как templateId.

...