BAEL-4887: fetching multiple entities in JPA query (#10803)

This commit is contained in:
Maciej Główka
2021-05-25 21:48:22 +02:00
committed by GitHub
parent c24379b927
commit 27c53fd6de
6 changed files with 240 additions and 0 deletions
@@ -0,0 +1,43 @@
package com.baeldung.jpa.returnmultipleentities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Objects;
@Entity
public class Channel {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String code;
private Long subscriptionId;
public void setCode(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public void setSubscriptionId(Long subscriptionId) {
this.subscriptionId = subscriptionId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Channel channel = (Channel) o;
return Objects.equals(id, channel.id) && Objects.equals(code, channel.code) && Objects.equals(subscriptionId, channel.subscriptionId);
}
@Override
public int hashCode() {
return Objects.hash(id, code, subscriptionId);
}
}
@@ -0,0 +1,23 @@
package com.baeldung.jpa.returnmultipleentities;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import java.util.List;
public class ReportRepository {
private final EntityManagerFactory emf;
public ReportRepository() {
emf = Persistence.createEntityManagerFactory("jpa-h2-return-multiple-entities");
}
public List<Object[]> find(String email) {
EntityManager entityManager = emf.createEntityManager();
Query query = entityManager.createQuery("SELECT c, s, u FROM Channel c, Subscription s, User u WHERE c.subscriptionId = s.id AND s.id = u.subscriptionId AND u.email=:email");
query.setParameter("email", email);
return query.getResultList();
}
}
@@ -0,0 +1,41 @@
package com.baeldung.jpa.returnmultipleentities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Objects;
@Entity
public class Subscription {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String code;
public void setCode(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public Long getId() {
return id;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Subscription subscription = (Subscription) o;
return Objects.equals(id, subscription.id) && Objects.equals(code, subscription.code);
}
@Override
public int hashCode() {
return Objects.hash(id, code);
}
}
@@ -0,0 +1,29 @@
package com.baeldung.jpa.returnmultipleentities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String email;
private Long subscriptionId;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public void setSubscriptionId(Long subscriptionId) {
this.subscriptionId = subscriptionId;
}
}
@@ -113,4 +113,24 @@
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
</properties>
</persistence-unit>
<persistence-unit name="jpa-h2-return-multiple-entities">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.baeldung.jpa.returnmultipleentities.Channel</class>
<class>com.baeldung.jpa.returnmultipleentities.Subscription</class>
<class>com.baeldung.jpa.returnmultipleentities.User</class>
<class>com.baeldung.jpa.returnmultipleentities.ReportRepository</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
</properties>
</persistence-unit>
</persistence>