在jpql查询中创建并填充pojos并获取列表

时间:2014-03-05 11:35:47

标签: java mysql hibernate jpa

我有以下实体和pojo:

@Entity
public class TableA {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
long id;
string name;
}

@Entity
public class TableB {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
long id;
double price;
@ManyToOne
@JoinColumn(name = "tableAId")
TableA tableA;

//setters & getters
}

统计

public class Statistics {
long tableAId;
double price;
long count;

public Statistics(long tableAId, double price, long count) {
this.tableAId = tableAId;
this.price = price;
this.count = count;
}

//setters & getters
}

我想做一个jpql查询来获取统计对象的结果列表,这些对象填充了tableA对象的引用id和TableB表中的价格列和行数。

我尝试使用以下代码但未成功:

Query query =  em.createQuery("SELECT NEW se.exampel.Statistics"
+ "(b.tableAId, sum(price) ,count(b)) from TableB b ");

List<Statistics> statistics = query.getResultList();

异常


java.lang.IllegalArgumentException:org.hibernate.QueryException:无法解析属性:tableAId    of:se.exampel.TableB [SELECT NEW se.exampel.Statistics(b.tableAId,count(b),sum(price))    来自se.exampel.TableB b]

我做错了什么?

现在已修复:    “从tabelB中选择新的se.exampel.Statistic(s.id,sum(p.price),count(p))p JOIN p.tabelA s GROUP BY s”

2 个答案:

答案 0 :(得分:1)

您正在将SQL概念混合到JPQL中。我需要在Entity TableB上进行查询,因此只能使用TableB java类中的映射属性。所以你需要使用类似的东西:

"SELECT NEW se.exampel.Statistics(b.tableA.id, sum(b.price) ,count(b)) from TableB b "

请注意,Hibernate可能会从tableB到tableA进行内部联接以获取A的ID。如果您希望能够以JPA中性方式直接访问TableB中的外键字段,则可能需要在TableB类中为其添加只读字段。像

这样的东西
@Column(name="tableA_ID", insertable=false, updatable=false);
long tableAId;

然后允许您在查询中访问b.tableAId:

"SELECT NEW se.exampel.Statistics(b.tableAId, sum(b.price) ,count(b)) from TableB b "

并且应该避免表连接。

答案 1 :(得分:0)

查询应包含b.tableA,它是属性名称而不是列名tableAId

更新,参考@Chris查询的评论应为

SELECT NEW se.exampel.Statistics(b.tableA.id,sum(b.price),count(b)) from TableB b