mysql - JPQL @ManyToMany 查询

标签 mysql jpa jakarta-ee jpql java-ee-7

我需要编写两个不同但相似的 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;
}

最佳答案

执行以下查询,将返回匹配的标签集以及匹配的标签:

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/

相关文章:

php - 使用 Laravel Eloquent 从查询中选择和排序数据

mysql - 使用指向同一个表的两个键创建 View ?

hibernate - Spring 中与 Hibernate 的 SQL 连接异常

java - Hibernate @OneToMany/@ManyToOne 列未找到

java - JDBC 从包含控制字符的数据库表中读取数据

java - java中使用socket的聊天应用程序的算法

mysql - Node - 查询处理完成后无法重定向(或者在处理完成之前重定向......或者......啊)

Lion 上的 MYSQL - 设置 root 密码

java - 配置 Hibernate 以适应现有的数据库约束?

java web app - 无法检索不是来自根文件夹的页面