There are two solutions to this problem.
Assuming you are using the following Post
entity:
@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;
}
}
And you have the following entities persisted in your database:
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))
);
Using a Java 8 Stream
Here's how you can return a Map
as requested by your question:
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()
);
Using a Hibernate ResultTransformer
The same goal can be achieved using a 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()
);