gpt4 book ai didi

java - 从 JPA 中的对象中选择列表

转载 作者:行者123 更新时间:2023-11-29 06:04:45 25 4
gpt4 key购买 nike

我有一个对象,其中包含一个列表作为其字段的一部分,该对象被映射到数据库。我正在尝试创建一个查询,该查询将从对象和前面提到的列表中选择几个字段。

对象映射:

@Entity
@Table(name="buys")
@PrimaryKeyJoinColumn(name="buy_id")
public class Buy extends DomainObject implements Serializable {

@Column(name = "buy_name")
private String buyName;

@OneToMany( cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name="buy_id", referencedColumnName = "buy_id")
private List<InsersionOrder> insertionOrders;

//other fields omitted

}

我正在使用的查询:

"select new com.dtos.domainObjects.BuyDTO(b.id, b.buyName, b.insertionOrders) from Buy b where b.buyGroupId = :groupId and b.isDeleted = false"

当运行这个查询时,hibernate(我的 JPA 供应商)生成一个错误的查询:

Hibernate: select buy0_.buy_id as col_0_0_, buy0_.buy_name as col_1_0_, . as col_2_0_ from buys buy0_ inner join domain_objects buy0_1_ on buy0_.buy_id=buy0_1_.id inner join insertion_orders insertiono1_ on buy0_.buy_id=insertiono1_.buy_id inner join domain_objects insertiono1_1_ on insertiono1_.io_id=insertiono1_1_.id where buy0_.buy_group_id=? and buy0_1_.is_deleted=0

InsertionOrder 字段也继承自 DomainObject。

如果我省略列表并仅从 Buy 对象中选择“简单”字段(即 id、名称),则查询工作正常。

我错过了什么?

谢谢。

最佳答案

此语法从结果集中的每一行创建一个 BuyDTO 实例。即使有效,它也不会返回您想要返回的内容。集合字段不能是 HQL 查询的选择子句的一部分。

第一个解决方案:不返回 DTO,返回实体本身。

第二种方案:选择实体,自己构建DTO实例:

select b from Buy b 
left join fetch b.insertionOrders i
where b.buyGroupId = :groupId and b.isDeleted = false

for (Buy b : list) {
dtoList.add(new BuyDTO(b.getId(), b.getBuyName(), b.getInsertionOrders());
}

第三种方案:选择你想要的,自己组装DTO:

select b.id, b.buyName, i 
from Buy b
left join b.insertionOrders i
where b.buyGroupId = :groupId and b.isDeleted = false

在结果的每一行中,您将找到一个 ID、一个 buyName 和一个 insertionOrder。因此,您必须在第一次遇到新 ID 时创建一个 DTO,并在下次遇到此 ID 时将订单添加到已构建的 DTO。

关于java - 从 JPA 中的对象中选择列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8910233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com