JPQL @ManyToMany запросы

Мне нужно написать два разных, но похожих запроса на JPQL, и в настоящее время мне не хватает опыта. Я действительно надеюсь, что кто-то может помочь.

  1. Вернуть все элементы, связанные с одним или несколькими тегами, запросив текущий класс тегов и вернув коллекцию элементов?
  2. Вернуть все элементы, содержащие ссылку на текущий класс Tag, выполняя запросы к каждому элементу и сравнивая их с коллекцией тегов?

Дополнительный вопрос:

  • Когда я добавляю тег в коллекцию элемента, автоматически ли элемент добавляется в коллекцию в теге?
  • Любые идеи о том, как я могу отсортировать возвращенные элементы в зависимости от количества тегов, которые они соответствуют? Могу ли я включить это в запрос JPQL?
  • Было бы лучше, чтобы мой класс Tag имел ключевое слово String как @id?

Мой код:

@Entity
@NamedQueries({
    @NamedQuery(name = Item.FIND_ALL, query = "select i from Item i")
})
@TableGenerator(name = "Item_ID_Generator", table = "ITEM_ID_GEN", pkColumnName = "PRIMARY_KEY_NAME",
        pkColumnValue = "Item.id", valueColumnName = "NEXT_ID_VALUE")
public class Item implements Serializable {

    public static final String FIND_ALL = "Item.findAll";
//    private static final long serialVersionUID = 1L;
    @Id
    @Column(nullable = false)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "Item_ID_Generator")
    private Integer id;

    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
    @JoinTable(name = "jnd_item_tag",
            joinColumns = @JoinColumn(name = "item_fk"),
            inverseJoinColumns = @JoinColumn(name = "tag_fk"))
    private List<Tag> tags = new ArrayList();
}  

@Entity
public class Tag implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Column(nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(unique = true)
    private String keyword;

    @ManyToMany(mappedBy = "tags")
    private List<Item> referencedByItem;
}

1 ответ

Выполните следующий запрос, который вернет наборы совпадающих тегов и соответствующие теги:

SELECT i, t FROM Item i JOIN i.tags t WHERE t.keyword IN :listOfTags

У меня этот случай может быть таким:

@NamedQuery(name = "selectByTags", query = "SELECT i, t FROM Item i JOIN i.tags t WHERE t.keyword IN :listOfTags")

//and here you need set your list

List<Tag> tags = daoTags.getListTags();

query.setParameter("listOfTags", listOfTags);

Я думаю, что адаптация этого запроса решает оба запроса на ваш вопрос.

Другие вопросы по тегам