我有以下实体和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”
答案 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