gpt4 book ai didi

java - Hibernate 按映射为 Map 的子项属性对实体进行排序

转载 作者:行者123 更新时间:2023-11-30 07:31:37 24 4
gpt4 key购买 nike

这是我的模型:

@Entity
@Table(name = "parent")
public class Parent {

...

@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true, cascade = { CascadeType.REMOVE}, mappedBy = "parent")
@MapKeyColumn(name = "key")
private Map<String, Child> children;

...

}

@Entity
@Table(name = "child")
public class Child {

...

@Column(name = "key")
private String key;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Parent parent;

@Column(name = "property")
private String property;

...

}

该映射很有用,可用于插入、更新、删除实体以及选择它们。

现在我必须根据映射键使用其子属性来订购父实体,例如 order by parent.children[<particular key>].property asc子句(我在 HQL 中没有找到)。我也不知道如何使用 Criteria API 来实现这一点。有什么想法吗?

我现在唯一的解决方案是选择按key过滤的 child 并按 property 订购然后在Java代码中一一获取父项,即使设置了“获取父项”,效率也很低。

最佳答案

表创建语句如下所示:

create table child (id bigint not null, key varchar(255), property varchar(255), parent_id bigint, primary key (id))
create table parent (id bigint not null, primary key (id))

对父表的parent_id 进行约束。

向后看,sql 看起来非常简单:

select p.* from parent p join child c on p.id = c.parent_id where c.key = 'c1' order by c.property asc;

因此 JPQL 和 Criteria 查询也应该是直接的:

List<Parent> po1 = em.createQuery("select p from Parent p join p.children c where c.key='c1' order by c.property asc", Parent.class).getResultList();
System.out.println(po1);

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Parent> cq = cb.createQuery(Parent.class);
Root<Parent> p = cq.from(Parent.class);
Join<Parent, Child> c = p.join("children");
cq.select(p).where(cb.equal(c.get("key"), "c1")).orderBy(cb.asc(c.get("property")));
List<Parent> po3 = em.createQuery(cq).getResultList();
System.out.println(po3);

为Parent创建一个toString方法:

public String toString() {
return "Parent:"+id+":"+children;
}

和 child :

public String toString() {
return "Child:"+id+":"+key+":"+property;
}

这给了我以下输出:

Hibernate: select parent0_.id as id1_1_ from parent parent0_ inner join child children1_ on parent0_.id=children1_.parent_id where children1_.key='c1' order by children1_.property asc
[Parent:4:{c1=Child:5:c1:0}, Parent:1:{c1=Child:2:c1:1}]
Hibernate: select parent0_.id as id1_1_ from parent parent0_ inner join child children1_ on parent0_.id=children1_.parent_id where children1_.key=? order by children1_.property asc
[Parent:4:{c1=Child:5:c1:0}, Parent:1:{c1=Child:2:c1:1}]

在我看来,这是由子属性排序的父项,其中键是某个值。

关于java - Hibernate 按映射为 Map<String, Child> 的子项属性对实体进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36034816/

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