java - 在 jpql 查询中创建和填充 pojos 并作为列表获取

标签 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 的: se.exampel.TableB [SELECT NEW se.exampel.Statistics(b.tableAId,count(b), sum(price)) 来自 se.exampel.TableB b ]

我做错了什么?

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

最佳答案

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

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

请注意,Hibernate 可能会执行从表 B 到表 A 的内部连接以获得 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 "

并且应该避免表连接。

关于java - 在 jpql 查询中创建和填充 pojos 并作为列表获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22196577/

相关文章:

java - 如何在 Android 10 中以编程方式设置自定义主题属性

mysql - MySQL 中的 DataDir 是什么?

java - 如何根据 JPA Web API 中的类型将 JSON 数据转换为两种 JSON 数组格式

java - 将数据从一个数据库复制到另一个数据库时如何解决org.hibernate.StaleObjectStateException?

java - 为什么这个十六进制值得到不同的十进制值?

Java:从 Singleton Holder 模式生成多个内部类

Java 泛型方法的行为不符合预期

php - 登录系统无法使用 php 和 mysql 工作

php - 将实时 Magento 2.1 站点迁移到本地主机时出错 : SQLSTATE[HY000] [1045] Access denied for user 'root' @'localhost'

java - 如何在 hibernate 中使用 DitachedCriteria 对名称列表 <User> 进行排序?