перебор коллекции в JPQL - PullRequest
       11

перебор коллекции в JPQL

0 голосов
/ 14 декабря 2011

Я пытаюсь найти ключевое слово в заголовках статей, телах и именах тегов, используя выражение LIKE. Статьи и теги определяются с использованием отношения один ко многим

Вот фрагмент кода из моего класса:

@Entity
public class Article implements Serializable {

   @Basic(optional = false)
   @NotNull
   @Lob
   @Size(min = 1, max = 65535)
   @Column(name = "body", nullable = false, length = 65535)
   private String body;
   @Basic(optional = false)

   @NotNull
   @Size(min = 1, max = 250)
   @Column(name = "title", nullable = false, length = 250)
   private String title;

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 9)
   @Column(name = "status", nullable = false, length = 9)
   private String status;

   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
   @JoinColumn(name = "articleId", referencedColumnName = "id", nullable = false)
   private List<Tag> tagList;

   // other attributes and methods
}

Также класс Tag имеет атрибут name .

У меня проблемы с поиском ключевого слова в именах тегов. Я пробовал этот код:

SELECT DISTINCT a FROM Article a ,IN(a.tagList) tag
            WHERE a.status = :status AND 
            (a.title LIKE :pattern OR a.body LIKE :pattern 
            OR tag.name LIKE :pattern)    

но это не дает должного результата; не все статьи показаны.

Итерирую ли я по тегам IN или мне нужно указать LEFT JOIN ? Любая помощь будет оценена.

спасибо заранее

если кто-то столкнется с такой проблемой, это решение отлично подойдет для моего случая

select distinct a from Article a left join a.tagList tag where a.status = :status and 
(a.title like :pattern or a.body like :pattern or tag.name like :pattern)

1 Ответ

1 голос
/ 14 декабря 2011

Прежде всего, вы используете in неправильно - оно должно быть в предложении where, а не в select.Я удивлен, что вы не получите исключение .( неправильно : см. Комментарий Микко).

Но в вашем случае вы не можете использовать in, так как хотите использовать оператор like.

Я бы попробовал что-то вроде этого:

select a from Article a join a.tagList tag where a.status = :status and 
    (a.title like :pattern or a.body like :pattern or tag.name like :pattern)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...