Ich habe die folgende Assoziation in einer Domain, an der ich arbeite (leider nicht wirklich Piraten). Ein Schiff hat viele Piraten. Ich möchte in der Lage sein, alle Schiffe zu finden, die einen Kapitän haben und keine Landratten in der Besatzung haben.
class Pirate {
String name
Rank rank
enum Rank {
CAPTAIN,
DECK_HAND,
LAND_LUBBER
}
}
class Ship {
static hasmany = [crew:Pirate]
}
Ich versuche, Hibernate-Kriterien zu verwenden, da ich auf lange Sicht möchte, dass dies eine benannte Abfrage ist, die ich mit anderen Abfragen verketten kann. Hier sind die Kriterien, die ich verwende.
def pirateShips = Ship.withCriteria {
crew {
eq('rank', Pirate.Rank.CAPTAIN)
not {
eq('rank', Pirate.Rank.LAND_LUBBER)
}
}
}
Wenn ich die folgenden Entitäten erstelle, erhalte ich nicht die erwarteten Ergebnisse.
def blackbeard = new Pirate(name:'Blackbeard', rank:Pirate.Rank.CAPTAIN).save()
def deckHand = new Pirate(name:'Deck Hand', rank:Pirate.Rank.DECK_HAND).save()
def landLubber = new Pirate(name:'Land Lubber', rank:Pirate.Rank.LAND_LUBBER).save()
def ship = new Ship(name:'Ship 1', crew:[blackbeard]).save()
def infiltrator = new Ship(name:'Ship 2', crew:[blackbeard, landLubber]).save()
def normalShip = new Ship(name:'Ship 3', crew:[blackbeard, deckHand]).save(flush:true)
Wenn ich die oben erwähnte Abfrage ausführe, werden alle 3 Schiffe zurückgegeben, obwohl ich erwarten würde, dass nur Schiff 1 und Schiff 3 zurückgegeben werden (Schiff 2 hat einen lästigen Landfresser, der für mich nicht von Nutzen ist).
Gibt es eine Möglichkeit, die Kriterien-API zu verwenden, um eine solche Abfrage zu erstellen? Wenn nicht, wie würde ich eine Abfrage in HQL schreiben?