【问题标题】:how to write SQL Statement - hibernate/persistence query exception - could not resolve property如何编写 SQL 语句 - 休眠/持久性查询异常 - 无法解析属性
【发布时间】:2012-08-23 20:09:21
【问题描述】:

我是 Hibernate 和 SQL 的新手,所以我可能做错了什么并且看不到它——即使现在已经花了第二天的时间:

在我的 PostgreSQL 数据库中,我有两个表:

PieChartResult
+---------+---------+--------------+-------+----------+----------+----------------+
| id      | answer  | approvalrate | input | worktime | workerid | piecharthit_id |
+---------+---------+--------------+-------+----------+----------+----------------+


PieChartHit
+---------+-----------+
| id      | truevalue |
+---------+-----------+

然后我在 pgAdmin 中编写以下 SQL 语句,效果很好:

 SELECT DISTINCT input, answer FROM piecharthit INNER JOIN piechartresult ON piecharthit.id=piechartresult_piecharthit_id;

我得到一个结果表,我可以在其中看到每个输入的所有收集答案。

当我尝试在 java 中编写相同的语句时

Query q = em.createQuery(SELECT DISTINCT a FROM PieChartHit a INNER JOIN a.PiechartResult b WHERE a.id=b.piecharthit_id")

我只是得到一个例外:

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: PieChartResult of: PieChartHit [SELECT DISTINCT a FROM PieChartHit a INNER JOIN a.PieChartResult b WHERE a.id=b.piecharthit_id]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1364)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294)
at Driver.main(Driver.java:37)
Caused by: org.hibernate.QueryException: could not resolve property: PieChartResult of: PieChartHit [SELECT DISTINCT a FROM PieChartHit a INNER JOIN a.PieChartResult b WHERE a.id=b.piecharthit_id]

这两个类看起来像这样:

@Entity
@Table(name="PieChartResult")
public class PieChartResult {

@Id
@GeneratedValue
private Long id;

private String workerID;
private String approvalRate;
private String input;
private double answer;

@ManyToOne
private PieChartHit piecharthit;

@Entity
@Table(name="PieChartHIT")
public class PieChartHit {

@Id
@GeneratedValue
private Long id;

private double trueValue;

有人可以指导这个迷失的灵魂吗? :(

【问题讨论】:

  • 我认为在我当前的项目中我做了同样的事情,如果您需要帮助,请告诉我。首先让我知道您是否能够运行简单的SELECT * 查询然后考虑复杂的查询。此外,在您的代码中,PieChartHit 中没有 PieChartResult 的引用基本上private List<PieChartResult> pieChartResult; 必须是PieChartHit 实体中代码的一部分我认为这个视频会有所帮助:youtube.com/…
  • 嗨。是的,'SELECT *' 语句工作正常。你知道如何打印查询“q”的所有结果吗?
  • 使用 mappedBy 方法观看视频,然后尝试使用 session.save 插入记录。我想我会创建一个新的答案,并会告诉你 impl。如果你觉得有帮助,请投票给我的答案:)

标签: java sql hibernate persistence hql


【解决方案1】:

对于初学者,您应该编写 HQL,而不是 SQL。这意味着您使用类/字段名称而不是表/列名称。请注意,异常显示“无法解析 property”。

此外,您的查询行中的 hql 字符串周围缺少引号。

编辑,根据您的代码,您从PieChartHit 中选择它对PieChartResult 的引用,但看起来这种关系不是双向的。还有

@Table(name="PieChartHIT")

您的大小写似乎有问题。

【讨论】:

  • 我支持这个。使用 Hibernate 的基本思想是不要自己编写复杂的连接查询。
【解决方案2】:

这是与原始评论的延续 它显示了如何将结果抓取到列表中。 我认为您需要更改 PieChartResultPieChartHit 的类定义才能使休眠模式正常工作。

String hql = "from CrawlerElement e where request.id = :requestId";
Query q = getSession().createQuery(sql); //getSession is not the actual method.
q.setParameter("requestId", id);
elements = q.list(); //elements is a List<CrawlerElement> where CrawlerElement which is actual @Entity
return elements;

【讨论】:

  • 感谢您的示例。但是你为什么认为我应该改变我的类定义呢?
  • 很难通过打字来解释,但我会尝试:你为什么不看我提到的视频,它解释了你的问题同上。看看这个。如果你想谷歌:使用注释的多对一和一对多休眠示例这个链接可能真的很有帮助hibernate
猜你喜欢
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多