Entschuldigt den Titel des Threads aber besser kann ich es kurz nicht erklären.
Ich habe zwei Entities (H, I) die keine Beziehung (im JPA Sinne) zueinander haben.
Beide haben jedoch ein Attribut (a) über dass diese in Beziehung gebracht werden können. Nun ist es jedoch so, dass es zu einem Wert H.a mehrere Einträge von I mit gleichem Wert a geben kann.
Ich Suche nun genau die H welche genau einem I mit H.a = I.a entsprechen.
Das nun folgende Beispiel verdeutlicht hoffentlich das Problem und funktioniert auch. Ich Frage mich jedoch ob es hier ein einfacheres Query gibt.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class I {
@Id
@GeneratedValue
private Long id;
private String a;
protected I() {
}
public I(final String a) {
this.a = a;
}
public Long getId() {
return id;
}
protected void setId(final Long id) {
this.id = id;
}
public String getA() {
return a;
}
protected void setA(final String a) {
this.a = a;
}
@Override
public String toString() {
return "I[" + a + "]";
}
}```
```package de.mvitz.jpa.foo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class H {
@Id
@GeneratedValue
private Long id;
private String a;
protected H() {
}
public H(final String a) {
this.a = a;
}
public Long getId() {
return id;
}
protected void setId(final Long id) {
this.id = id;
}
public String getA() {
return a;
}
protected void setA(final String a) {
this.a = a;
}
@Override
public String toString() {
return "H[" + a + "]";
}
}```
```package de.mvitz.jpa.foo;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Main {
public static void main(final String[] args) {
final EntityManagerFactory emf = Persistence.createEntityManagerFactory("h2foo");
try {
// create initial data
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(new I("1"));
em.persist(new I("1"));
em.persist(new I("2"));
em.persist(new H("1"));
em.persist(new H("2"));
em.persist(new H("3"));
em.getTransaction().commit();
em.close();
// query
em = emf.createEntityManager();
em.getTransaction().begin();
final List<H> result = em
.createQuery(
"SELECT h FROM H h WHERE"
+ " h.a IN (SELECT h.a FROM H h, I i WHERE h.a = i.a GROUP BY h.a HAVING COUNT(1) = 1)",
H.class).getResultList();
System.out.println(result);
em.getTransaction().commit();
em.close();
} finally {
emf.close();
}
}
}```
Das korrekte Ergebnis hier ist, dass die Liste result genau ein H enthält mit a = 2.