【问题标题】:Entity Manager, creating query实体管理器,创建查询
【发布时间】:2014-09-13 16:56:23
【问题描述】:

我有这么两个类:

public class Average {
long id;
String name;
double average;
public Average(long id , String name , double payment)
{
    this.id = id;
    this.name = name;
    this.payment = payment;
}

@Override
public String toString()
{
    return id + "\t" + name + " " + payment;
}
}

@Entity
public class Payment{
@Id
@GeneratedValue
long    id;
Student student;
Subject subject;
double  payment;

public Payment()
{
}

我想用 java 对这个类执行查询,但它不能正常工作。有什么问题。贝娄我从另一个我称之为的班级发布了我的查询:

public List<Object> getPayment()
{
    Query q = entityManager.createQuery("Select NEW Average( g.subject.id , g.subject.name , AVG(g.payment) ) from Payment g GROUP BY g.subject.id, gge.subject.name");
    return q.getResultList();
}

请耐心等待,这是我的第一篇文章!

【问题讨论】:

  • 欢迎来到 Stack Overflow!请提供有关究竟出了什么问题的信息。
  • 我不确定到底出了什么问题,因为查询没有显示任何内容。也没有错误...
  • 你是否开启了 Hibernate 调试日志?每当数据库中出现问题(而不是在您的 Java 代码中),这就是要做的事情。

标签: java hibernate jpa entitymanager


【解决方案1】:

Average 不是一个实体(你应该用@Entity 注释它——就像你为Payment 所做的那样)所以你不能执行entityManager.createQuery()。 你也应该在@Entity之后和类名之前指定表@Table(name = "XXX")

查询应该是这样的:

Select g.subject.id , g.subject.name , AVG(g.payment) from Average a, Payment g GROUP BY g.subject.id, g.subject.name

-- 更新

如果Average 是用于投影的 Bean 类,则执行以下操作:

 Object[] payments = (Object[]) entityManager.createQuery("Select g.subject.id,
 g.subject.name, AVG(g.payment) from Payment g
 GROUP BY g.subject.id, g.subject.name").getSingleResult();

然后遍历payments的对象:

for (Object object : payments) {
    System.out.println(object);
}

如果结果只有一行,则放入 getSingleResult 否则您需要对象的 List 并遍历列表:

List<Object[]> payments = (List<Object[]>) entityManager.createQuery("Select g.subject.id,
     g.subject.name, AVG(g.payment) from Payment g
     GROUP BY g.subject.id, g.subject.name").getResultList();

然后遍历payments的对象:

if (payments != null){        
    for (Object[] object : payments) {
        System.out.println(object[0] + " " + object[1] + " " + object[2]);
    }
}

【讨论】:

  • 为什么我需要这部分:from Average a?
  • 根据您提供的查询,我认为您需要它。如果不需要,请删除它。
  • Average对象只是用来投影的,为什么要加上@Entity注解呢?您提出的查询没有意义。
  • 这是一种错误的投影方式。您不能对非实体执行entityManager.createQuery()。他应该首先对Payment 执行createQuery(),然后返回结果(对象数组列表),然后将它们映射到Bean 类(平均值)。我以为Average是一个实体,所以我建议用@Entity注释它。
【解决方案2】:

会不会是 gge 而不是 GROUP BY g.subject.id, gge.subject.name 中的 g

【讨论】:

    猜你喜欢
    • 2019-10-06
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2019-11-23
    • 2018-04-26
    • 2016-07-02
    • 2015-01-30
    相关资源
    最近更新 更多