JPQL @ManyToMany查询

时间:2016-10-27 16:19:36

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

我需要编写两个不同但相似的JPQL查询,目前缺乏专业知识。我真的希望有人可以提供帮助。

  1. 通过查询当前的Tag类并返回项目集合,返回与一个或多个标签关联的所有项目?
  2. 通过查询每个项目并与标签集合进行比较,返回包含对当前Tag类的引用的所有项目?
  3. 其他问题:

    • 当我在项目集合中添加标签时,该项目会自动添加到标签中的集合中吗?
    • 关于我如何根据匹配的标签数量对退回的商品进行排序的任何想法?我可以在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 个答案:

答案 0 :(得分:0)

执行以下查询,该查询将返回匹配的标记集和匹配的标记:

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);

我认为调整此查询可以解决您的问题的两个请求。