【问题标题】:Hibernate ManyToOne with @Formula使用@Formula 休眠多对一
【发布时间】:2012-09-01 10:20:57
【问题描述】:

我有两个数据库表,并希望使用 Hibernate 在两者之间建立多对一关系。

这两张表不是我做的,但在我开始做这个项目的时候就已经做好了。我是 Hibernate 的新手,想在两个表之间建立多对一关系。

这通常会很困难,但是两个表之间的链接,“Praxiscode”不是主键,我想做类似的事情

@ManyToOne(targetEntity = PraxisIITest.class)
    @Fetch(FetchMode.JOIN)
    @NotFound(action = NotFoundAction.IGNORE)
    @Formula(value = "(SELECT praxis.ID FROM lstPraxis praxis where praxis.Praxiscode=Praxiscode and Testdate BETWEEN praxis.BeginDate AND praxis.EndDate)")
    private PraxisIITest praxisIITest;

但在指定上述@Formula 时,它会引发异常,抱怨列不在“字段列表”中

org.hibernate.exception.SQLGrammarException: Unknown column 'praxisiite1_.praxisIITest_ID' in 'field list'
    org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)

这是在 PraxisIITest 中指定 ID 的地方 ->

@Entity
@Table(name="lstPraxis")
@Cache(region="edu.uky.cepis.cache.praxisIItest", usage=CacheConcurrencyStrategy.READ_WRITE)
public class PraxisIITest implements java.util.Comparator<PraxisIITest>, Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID")
    private long id;

我做错了吗?还是我错过了一些非常基本的东西,我的理解是这应该有效......

非常感谢任何想法或建议!再次提前感谢!

【问题讨论】:

  • 盯着这个看什么都不会跳出来...应该帮助的是跟踪/记录生成的(由 Hibernate)SQL。
  • 您使用的是什么数据库平台?通常,您可以使用数据库诊断工具(即 MySQL Query Log 或 MS SQL Server Profiler)来查看 Hibernate 在幕后所做的事情......
  • 我将日志记录级别设置为跟踪,但还没有看到任何明显的东西......
  • 我启用了日志记录,在查看了 mysql 日志以及 hibernate 在“幕后”所做的事情之后,我似乎仍然无法找到问题......,当我添加 @JoinColumn(name = "PRAXISCODE")它不再抛出错误,而是根本没有得到 PraxisIITest(调试时它在 mysql select 语句之后为空)

标签: java spring hibernate jakarta-ee hibernate-mapping


【解决方案1】:

我认为问题在于您没有使用有效的 SQL 片段;它假设 Hibernate 会做一些别名:

(SELECT praxis.ID FROM lstPraxis praxis where praxis.Praxiscode=Praxiscode and Testdate BETWEEN praxis.BeginDate AND praxis.EndDate)

lstPraxis 表中不存在Testdate(根据您的图像),它在 tbl20Praxis 表中。即使该表是 PraxisIITest 实体所映射到的表,我认为您需要在 @Formula 片段中显式地进行表连接。

我认为 Hibernate 没有对公式进行任何处理,而是将其视为原生 SQL。但这会使您看到的错误更加令人困惑...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多