Hallo,
ich habe folgende Situation. Es gibt eine Tabelle SoftwareProduct und eine Tabelle Version. Die beiden sind über eine n:m-Beziehung miteinander verbunden. Um diese zu realisieren, gibt es noch die Tabelle SoftwareRequirements. In SoftwareRequirement stehen nur die Primärschlüssel der beiden anderen Tabellen als Fremdschlüssel. Damit soll abgebildet werden, dass (Programm)-Versionen bestimmte Software als Voraussetzung benötigen.
Jetzt brauche ich eine Abfrage, die alle Softwareprodukte liefert, die noch nicht als Voraussetzung für eine bestimmte Version eingetragen sind.
In MySql scheint folgende Abfrage zu funktionieren: select * from softwareproduct s where s.softwareproductId not in (select softwareproductid_fk from softwarerequirements sr where versionid_fk = 6)
Mit Hibernate habe ich es mit folgender Anweisung versucht:
select s from SoftwareProduct s where s.softwareProductId not in (select vr.softwareProductId from Version v join v.softwareRequirements vr where v.versionId = 6);
Ich bekomme keine Datensätze als Ergebnis. Die Beziehung habe ich folgendermaßen implementiert:
Code:
@Entity
@Table(name = "Version")
public class VersionImpl extends BeanBaseImpl implements Version{
private int versionId;
private List<SoftwareProductImpl> softwareRequirements;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int getVersionId() {
return versionId;
}
public void setVersionId(int versionId) {
this.versionId = versionId;
}
@ManyToMany
@JoinTable(name = "softwareRequirements", joinColumns = {@JoinColumn(name = "softwareProductId_fk")},
inverseJoinColumns = {@JoinColumn(name = "versionId_fk")})
public List<SoftwareProductImpl> getSoftwareRequirements() {
return softwareRequirements;
}
public void setSoftwareRequirements(List<SoftwareProductImpl> softwareRequirements) {
this.softwareRequirements = softwareRequirements;
}
}
@Entity
@Table (name = "SoftwareProduct")
public class SoftwareProductImpl implements SoftwareProduct{
private int softwareProductId;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int getSoftwareProductId() {
return softwareProductId;
}
public void setSoftwareProductId(int softwareProductId) {
this.softwareProductId = softwareProductId;
}
}
Es ist vorerst nur als unidirektionale Beziehung implementiert.
Weiß jemand, warum mir Hibernate keine Datensätze zurückliefert, obwohl ich ganz genau weiß, dass ein Datensatz existiert? Ich habe mit join ein wenig experimentiert und musste feststellen, dass das nie funktioniert. Auch wenn ich die Abfrage ganz einfach stricke, sobald ich mit join auf die n:m-Beziehung zugreifen möchte, erhalte ich kein Ergebnis.
Viele Grüße,
Christopher