JPQL @ManyToMany запросы
Мне нужно написать два разных, но похожих запроса на JPQL, и в настоящее время мне не хватает опыта. Я действительно надеюсь, что кто-то может помочь.
- Вернуть все элементы, связанные с одним или несколькими тегами, запросив текущий класс тегов и вернув коллекцию элементов?
- Вернуть все элементы, содержащие ссылку на текущий класс 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);
Я думаю, что адаптация этого запроса решает оба запроса на ваш вопрос.