当前位置: 首页 > 知识库问答 >
问题:

如何使用ManyToOne映射在字段上编写Hibernate会话查询JOIN无关实体

尹昀
2023-03-14

我有一个使用Hibernate 5.1.5的grails 3.3.2项目。最后,我将一些JPA实体类映射到现有的Oracle表。我可以使用Hibernate创建一个会话查询,如果第二个实体没有将第一个实体引用为多个One联接的列映射,那么它可以毫无问题地返回两个表上的查询结果。如果我将该列作为manytone映射而不是字符串创建实体,那么在尝试运行查询时会出现错误。

以下是尝试执行查询时的错误。

原因:org.hibernate.hql.internal.ast.InvalidSusClauseException: with子句只能引用驱动表中的列[选择t.term作为edu.utica.jpa.entity.general.validation.Term t JOINedu.utica.jpa.entity.ar.MealPlanDeadline pd ONpd.term=t.term其中pd.deadline不为空]

这是当前形式的查询,如果“pd.term”映射为字符串而不是其实体类中的ManyToOne关系,则此查询有效。

  List getMealPlanTerms() {

    List terms = []
    Term.withSession{ session ->
        Query query = session.createQuery("""select t.term as term
                                               from Term t
                                                    JOIN MealPlanDeadline pd ON pd.term = t.term
                                              where pd.deadline is not null""")
        query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
        terms = query.list()
    }
 }

MealPlanDeadline实体类中术语的当前映射

@ManyToOne
@JoinColumns([
        @JoinColumn(name = "TYRCMPD_TERM", referencedColumnName = "STVTERM_CODE")
])
Term term

如果像这样映射,查询会起作用并返回我所期望的结果。

@Column(name = "TYRCMPD_TERM")
String term

有没有人对如何使用ManyToOne风格的连接列有任何想法?

非常感谢。

我只是用另一个方向的表/类重新编写了这篇文章,它起到了作用。但我不能完全确定为什么它是这样工作的,而不是另一种。可能与MealPlanDeadline类上的manytone映射有关。在SQL中,两个方向都可以很好地工作,所以这几乎像是hibernate中的一个bug。或者只是愚蠢的行为。

    List getMealPlanTerms() {

    List terms = []
    Term.withSession{ session ->
        Query query = session.createQuery("""select t.term as term
                                                   ,t.description as description
                                                   ,t.startDate as startDate
                                                   ,t.endDate as endDate
                                                   ,t.aidYear as aidYear
                                                   ,t.acyr as acyr
                                                   ,t.id as id
                                                   ,t.version as version
                                               from MealPlanDeadline pd
                                                    JOIN Term t ON t.term = pd.term
                                              where pd.deadline is not null   
                                              """)
        query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
        terms = query.list()
    }
}

共有1个答案

冯星阑
2023-03-14

你试过这个吗?

    Query query = session.createQuery("""select t.term as term
                                               ,t.description as description
                                               ,t.startDate as startDate
                                               ,t.endDate as endDate
                                               ,t.aidYear as aidYear
                                               ,t.acyr as acyr
                                               ,t.id as id
                                               ,t.version as version
                                           from MealPlanDeadline pd
                                                JOIN Term t ON t.term.id = pd.term.id
                                          where pd.deadline is not null   
                                          """)

如果这不起作用,您将不得不使用Hibernate 5.2,它增加了对这种用法的支持。

 类似资料:
  • 问题内容: 考虑表 这是使用查询生成的视图 我想为总销售额创建一个实体,但没有sql端的视图。 该实体将通过查询构造。我发现的最接近的东西是 this ,但是我无法使其工作。 即使我定义了加载器,hibernate也会查找实体表并在找不到时给出错误。如果我创建表,它不会从我定义的命名查询中加载实体,Hibernate会生成查询本身。 有没有一种方法可以使@Loader工作,或者有另一种我可以将查询

  • 问题内容: 可以请一些人提供如何使用联接编写以下sql查询的方法。我不希望尽量不要使用 in ,我也想替换 where 条件。 我正在使用SQL Server 2008 问题答案: 本文: NOT IN与NOT EXISTS与LEFT JOIN / IS NULL:SQL Server 如果您感兴趣的话。 简而言之,此查询: 可以工作,但是效率不如(或)构造。 您还可以使用以下命令: 这既不使用也

  • 我有EntityA和EntityB,它们具有一个从EntityA->EntityB的OneToMany关系。我想将EntityB作为属性包含到EntityA中。 另一种解决方法是在方法中获取并设置该属性,但我的目标是在entity类中找到一个解决方案。有人有主意吗?谢谢

  • 问题内容: 我想加入两个表CUSTMR和DEPRMNT。 我需要的是:LEFT OUTER JOIN内有两个或多个带有子查询的表的LEFT OUTER JOIN,如下所示: 表格:CUSTMR,DEPRMNT 查询为: 这里的子查询是: 是否可以在LEFT OUTER JOIN内编写这样的子查询? 在我的DB2数据库上运行此查询时出现错误。 问题答案: 您需要在子选择上使用“ correlatio

  • 问题内容: 我想用Hibernate映射超类中的通用字段。 我的母亲班是: 一个子类: 如您所见,我将覆盖value字段以指定要在数据库中使用的列。我的表ParameterValue由几列组成,每种类型对应一列。 但是hibernate抱怨: 好的,但是超类中getValue的良好配置是什么?(我在“需要帮助的地方”发表了评论) 问题答案: 我很确定您不能将单个Java属性映射到三个不同的列。您将