gpt4 book ai didi

java - 如何使用 JPA 和 Hibernate 返回一个 Map,其中键是实体属性,值是实体

转载 作者:行者123 更新时间:2023-11-30 01:42:43 25 4
gpt4 key购买 nike

假设我有一个 sql 表

create table CUSTOMER
(
first_name VARCHAR2(30) not null,
last_name VARCHAR2(30) not null,
age VARCHAR2(30) not null,
credit_card_num VARCHAR2(30) not null UNIQUE
);

我想要一个 Java Map,其中映射键的值为 CUSTOMER.credit_card_num map 值都是 CUSTOMER 的属性例如:

1234134cardnumber -> Customer(first_name: Jack, age: 23, credit_card_num: 1234134cardnumber),
123faef -> Customer(first_name: Mike, age: 43, credit_card_num: 123faef)

等等...

我会接受在 JPA 或 Native Query 中执行此操作的任何方式

更新

https://stackoverflow.com/users/1025118/vlad-mihalcea 所提及可以通过https://vladmihalcea.com/why-you-should-use-the-hibernate-resulttransformer-to-customize-result-set-mappings/来完成

最佳答案

这个问题有两种解决方案。

假设您使用以下 Post 实体:

@Entity(name = "Post")
@Table(name = "post")
public class Post {

@Id
private Long id;

private String title;

@Column(name = "created_on")
private LocalDate createdOn;

public Long getId() {
return id;
}

public Post setId(Long id) {
this.id = id;
return this;
}

public String getTitle() {
return title;
}

public Post setTitle(String title) {
this.title = title;
return this;
}

public LocalDate getCreatedOn() {
return createdOn;
}

public Post setCreatedOn(LocalDate createdOn) {
this.createdOn = createdOn;
return this;
}
}

并且您的数据库中保留了以下实体:

entityManager.persist(
new Post()
.setId(1L)
.setTitle("High-Performance Java Persistence eBook has been released!")
.setCreatedOn(LocalDate.of(2016, 8, 30))
);

entityManager.persist(
new Post()
.setId(2L)
.setTitle("High-Performance Java Persistence paperback has been released!")
.setCreatedOn(LocalDate.of(2016, 10, 12))
);

entityManager.persist(
new Post()
.setId(3L)
.setTitle("High-Performance Java Persistence Mach 1 video course has been released!")
.setCreatedOn(LocalDate.of(2018, 1, 30))
);

entityManager.persist(
new Post()
.setId(4L)
.setTitle("High-Performance Java Persistence Mach 2 video course has been released!")
.setCreatedOn(LocalDate.of(2018, 5, 8))
);

entityManager.persist(
new Post()
.setId(5L)
.setTitle("Hypersistence Optimizer has been released!")
.setCreatedOn(LocalDate.of(2019, 3, 19))
);

使用 Java 8 流

以下是您如何根据问题的要求返回 map :

Map<Long, Post> postByIdMap = entityManager
.createQuery(
"select p " +
"from Post p ", Post.class)
.getResultStream()
.collect(
Collectors.toMap(
Post::getId,
Function.identity()
)
);

assertEquals(
"High-Performance Java Persistence eBook has been released!",
postByIdMap.get(1L).getTitle()
);

assertEquals(
"Hypersistence Optimizer has been released!",
postByIdMap.get(5L).getTitle()
);

使用 Hibernate ResultTransformer

使用 ResultTransformer 可以实现相同的目标:

Map<Long, Post> postByIdMap = (Map<Long, Post>) entityManager
.createQuery(
"select p " +
"from Post p ")
.unwrap(org.hibernate.query.Query.class)
.setResultTransformer(
new ResultTransformer() {

Map<Long, Post> result = new HashMap<>();

@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
Post post = (Post) tuple[0];
result.put(
post.getId(),
post
);
return tuple;
}

@Override
public List transformList(List collection) {
return Collections.singletonList(result);
}
}
)
.getSingleResult();

assertEquals(
"High-Performance Java Persistence eBook has been released!",
postByIdMap.get(1L).getTitle()
);

assertEquals(
"Hypersistence Optimizer has been released!",
postByIdMap.get(5L).getTitle()
);

关于java - 如何使用 JPA 和 Hibernate 返回一个 Map,其中键是实体属性,值是实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59388177/

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