mysql - 选择多列并将其设置为 DTO 列表

标签 mysql sql database jpa jpql

我想在单个查询中从数据库获取多个列并将其设置为相应的 DTO 对象字段。

错误消息:

java.lang.IllegalStateException: No data type for node:
org.hibernate.hql.internal.ast.tree.IdentNode
 +-[IDENT] IdentNode: 'payment' {originalText=payment}

查询:

TypedQuery<Object[]> query = entityManager.createQuery("SELECT
payment, createdOn,responseMessage FROM PaymentLog log WHERE log.id
=:personId", Object[].class);

query.setParameter("personId",new BigInteger(basicEntityDto.getId()));
List<Object[]> results =  query.getResultList();

for (Object[] log : results) {
   paymentTransaction.setAmount(log[0].toString());
   paymentTransaction.setDate(log[1].toString());
   paymentTransaction.setDescription(log[2].toString());
   transactionList.add(paymentTransaction);
}

附注我知道我可以使用 JPA 构造函数表达式。但是,由于我必须将 DTO 添加到 DTO 列表(即 transactionList)中,因此有没有一种使用 JPA 构造表达式的方法,可以通过仅运行一次查询而不是在每个 DTO 的循环中来实现这一点? p>

最佳答案

您可以让 JPA 提供程序通过构造函数表达式为您转换结果集:

http://www.objectdb.com/java/jpa/query/jpql/select#Result_Classes_Constructor_Expressions_

https://en.wikibooks.org/wiki/Java_Persistence/JPQL#Constructors

这要求指定的类具有与选择表达式匹配的构造函数。这将如下所示:

TypedQuery<PaymentTransaction> query = entityManager.createQuery("SELECT new PaymentTransaction (log.payment, log.createdOn, log.responseMessage ) FROM PaymentLog log WHERE log.id
=:personId", PaymentTransaction.class);
query.setParameter("personId",new BigInteger(basicEntityDto.getId()));
List<PaymentTransaction> results =  query.getResultList();

在 JPA 2.1 中,您还可以像下面这样:

https://en.wikibooks.org/wiki/Java_Persistence/Querying#ConstructorResult_.28JPA_2.1.29

关于mysql - 选择多列并将其设置为 DTO 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34371886/

相关文章:

mysql - SQL Join 给出 30 个相同的结果

sqlplus,以1列导出查询,并且是无序的

c# - 无法连接到远程 MySQL 数据库

sql - 两次左连接一次查询MySQL性能问题

mysql - 获得 5 个下一个生日,包括明年

python - 无法创建 mysql 数据库 python ("can' t 连接到服务器 localhost")

mysql - 将一列从一个数据库复制到另一个数据库

php - 使用 mysqli 的 Bind_param 非对象错误

mysql - 合并 SQL 中相似 ID 的行?

mysql - 如何从MySQL表中获取多列具有相同值的所有行?