2017-01-28 2 views
1

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?

+0

Haben Sie versucht, 'findByOpinionsIn ( tags Satz)'? –

+0

@AliDehghani Das hat mich bringt positive Ergebnisse, aber sie sind für jeden passenden Tag wiederholt. – Pietu1998

+0

Was meinst du? Sie erhalten einige Nachrichten mehr als einmal? –

Antwort

2

Liste findByTags (Set tag);

Wie Sie aus dem Abfrageprotokoll sehen können, wird diese Abfrage Methode nur Nachrichten finden, die mit allen Tags in den gegebenen tag Parametern markiert sind, das ist nicht das, was Sie wollen.

Um Nachrichten zu finden, die mit einem dieser Tags versehen sind, können Sie die folgende Abfrage-Methode verwenden können:

List<Message> findByTagsIn(Set<Tag> tag); 

Ich habe Ergebnisse, aber es gab ein weiteres Problem: die Ergebnisse wurden wiederholt für jedes passende Tag, wie man aus der Abfrage erraten könnte.

Um diese wiederholten Nachrichten loszuwerden, können Sie nur unterschiedliche Werte holen:

List<Message> findDistinctByTagsIn(Set<Tag> tag); 
Verwandte Themen