我需要编写两个不同但相似的 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;
}
最佳答案
执行以下查询,将返回匹配的标签集以及匹配的标签:
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);
我认为调整此查询可以解决您问题的两个请求。
关于mysql - JPQL @ManyToMany 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40289680/