Java 实体管理器,创建查询

Java 实体管理器,创建查询,java,hibernate,jpa,entitymanager,Java,Hibernate,Jpa,Entitymanager,我有两门课: 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 + "

我有两门课:

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;
}
}

我想用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();
}
请耐心点,这是我的第一篇帖子

是否可以通过g.subject.id、gge.subject.name在分组中使用gge而不是g?

平均值不是一个实体,您应该使用@entity对其进行注释-就像您为付款所做的那样,因此您无法执行entityManager.createQuery。 您还应该在@Entity之后和类名之前指定表@Tablename=XXX

查询应该类似于:

选择g.subject.id、g.subject.name、AVGg.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();
然后通过支付对象进行迭代:

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

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();

欢迎来到堆栈溢出!请包括到底出了什么问题的信息。我不确定到底出了什么问题,因为查询并没有显示任何内容。也没有错误…是否打开了Hibernate调试日志记录?当数据库中的某些东西与Java代码中的不一样时,就应该这样做。为什么我需要这个部分:从平均值a?根据您提供的查询,我认为您需要它。如果不需要它,就把它移除。普通的对象只是用来投影的,那么他为什么要添加@Entity注释呢?你提出的问题毫无意义,但这是一种错误的投影方式。不能对非实体执行entityManager.createQuery。他应该首先在付款时执行createQuery,然后返回对象数组的结果列表,然后将它们映射到Bean类平均值。我认为Average是一个实体,这就是为什么我建议用@entity注释它。
for (Object object : payments) {
    System.out.println(object);
}
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();
if (payments != null){        
    for (Object[] object : payments) {
        System.out.println(object[0] + " " + object[1] + " " + object[2]);
    }
}