使用 Hibernate 使用外键 (where) 查询数据库表

Posted

技术标签:

【中文标题】使用 Hibernate 使用外键 (where) 查询数据库表【英文标题】:Query a database table using a foreign key ( where) using Hibernate 【发布时间】:2014-11-19 00:42:23 【问题描述】:

我是休眠新手,所以这个问题可能看起来很愚蠢。

我有两张桌子:

应用:

@Entity
@Table
public class Application extends BaseSimpleEntity 
    @Column(nullable = false)
    private String appID;
    @OneToOne(cascade = CascadeType.ALL)
    @Searcheable
    private LocalizedString name;
...

编译:

@Table
@Entity
public class Compilation extends BaseSimpleEntity 

    @Column(nullable = false)
    private String uid;
    @ManyToOne
    private Application application;
    @Column
    private DateTime creationDate;
    @Column
    private DateTime finishDate;
    @Column
    private String path;
....

我想获得与给定应用程序匹配的编译列表。

我做了以下查询:

@Query("FROM Compilation c WHERE c.Application.id = :applicationId")
List<Compilation> findValidCompialiton(@Param("applicationId") Long applicationId);

但它不起作用。

错误:

原因:org.hibernate.QueryException:无法解析属性: 应用:xx.xx.xx.xx.xx.编译[FROM xx.xx.xx.xx.xx.Compilation c WHERE c.Application.id = :applicationId] 在 org.hibernate.QueryException.generateQueryException(QueryException.java:137) 在 org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:126) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:88) 在 org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190) 在 org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) 在 org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) 在 org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800) 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328)

【问题讨论】:

【参考方案1】:

您的查询应该是:

@Query("FROM Compilation c WHERE c.application.appID = :applicationId")

您为实体创建了别名c,Hibernate 尝试检查Compilation,现在您可以访问Compilation 实体的属性。现在Compilation 类中的属性是application,这个application 属性代表Application,它的字段为appID

【讨论】:

以上是关于使用 Hibernate 使用外键 (where) 查询数据库表的主要内容,如果未能解决你的问题,请参考以下文章

空外键(Springboot、Hibernate、Postman)

为啥 Hibernate 不填充这个外键列

选择查询上的 Hibernate-外键对象 Null

hibernate级联更新外键问题

hibernate表关系

Hibernate/H2 外键抛出 org.h2.jdbc.JdbcSQLException