ich einen Frühling Boot-Anwendung haben, die ein Unternehmen wie diese enthält (einige für Kompaktheit gestrippt Felder):alle Einträge zu finden, wo eine Sammlung Feld eine der angegebenen Elemente enthält
@Entity
public class Message extends AbstractPersistable<Long> {
@ManyToMany(targetEntity = Tag.class, fetch = FetchType.EAGER)
private Set<Tag> tags;
// getter and setter for tags here
}
Tag
ist nur eine einfache Einheit mit ein Namensfeld
Nun, ich habe eine andere Set<Tag>
in meinem Code vom Benutzer erhalten. Ich möchte alle Message
s finden, die eines der Tags in diesem Set haben. wenn wir die folgenden Meldungen haben zum Beispiel:
ID TAGS
1 1, 2, 3
2 2, 5, 7
3 2, 4, 7
Dann sollte die Abfrage, da die Menge [3, 4]
Meldungen zurück 1 und 3.
ich versuchte, dieses Repository zu schreiben:
public interface MessageRepository extends JpaRepository<Message, Long> {
List<Message> findByTags(Set<Tag> tag);
}
Ich aktiviert query logging und mein Code produziert eine Abfrage, die ich hier ein bisschen aufgeräumt habe. Die Abfrage erzeugt keine Ergebnisse in den Fällen, die ich versuchte, und ich habe keine Ahnung, was der scalar = array
Vergleich tut.
SELECT message.id AS id FROM message
LEFT OUTER JOIN message_tags ON message.id = message_tags.message_id
LEFT OUTER JOIN tag ON message_tags.tags_id = tag.id
WHERE tag.id = (1,2,3,4,5) -- this is the input set
Wie @AliDehghani vorgeschlagen habe ich versucht, die Methode als findByTagsIn(Set<Tag> tag)
zu schreiben. Dies ersetzt die letzte =
durch in
in der Abfrage.
Ich habe Ergebnisse, aber es gab ein anderes Problem: Die Ergebnisse wurden für jedes passende Tag wiederholt, wie man aus der Abfrage erraten könnte. Wenn Sie beispielsweise mit den obigen Beispielnachrichten nach [2, 7]
suchen, erhalten Sie zweimal die Nachricht 1, die Nachricht 2 und die Nachricht 3.
Soweit ich weiß, könnte das Hinzufügen einer Art von GROUP BY
Klausel hier helfen. mit @Query
oder etwas anderes
Die predefined query method keywords scheinen keine Funktionen dieser entweder mit Bezug zu haben, so dass ich glaube, ich habe meine eigene schreiben.
Ich kann nicht scheinen, herauszufinden, eine Abfrage, die auch funktionieren würde, und ich bin nicht sehr erfahren in H2, so dass ich nicht wirklich raten möchte, wie man auch arbeiten könnte.
Ich möchte nicht eine Methode schreiben, die alle Nachrichten mit einem einzigen Tag finden, rufen Sie es für jedes Tag und kombinieren Sie die Ergebnisse, da das hässlich wäre und, bei vielen Tags als Eingabe, sehr langsam. Wie soll ich meine Abfrage-Methode schreiben?
Haben Sie versucht, 'findByOpinionsIn ( tags Satz)'? –
@AliDehghani Das hat mich bringt positive Ergebnisse, aber sie sind für jeden passenden Tag wiederholt. – Pietu1998
Was meinst du? Sie erhalten einige Nachrichten mehr als einmal? –