连接表上的HIbernate @manytomany标准

时间:2014-03-05 17:15:33

标签: java mysql hibernate

我有以下@manytomany:

@ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "category_relation", joinColumns = { @JoinColumn(name = "category_id") }, inverseJoinColumns = { @JoinColumn(name = "child_id") })
    private Set<Category> children = new HashSet<Category>();

我想创建一个Criteria,它会将所有Cateogry带到他们的父market_id是x。

Category looks like this:
     -id
     -name
     -market_id
Cateogry_relation
     -id
     -category_id
     -child_id

它应该类似于

select category_relation.child_id from category,category_relation where category.market_category_id = 2984 and category_relation.category_id = category.id

但不是仅返回child_id,而是返回完整的类别对象 我写了以下内容:

Criteria criteria = getSession().createCriteria(Category.class);
criteria.createCriteria("children").add(Restrictions.eq("parent_id", parentId));

但它不起作用 - 我得到一个例外,即Category没有parent_id字段

我该怎么做?

1 个答案:

答案 0 :(得分:0)

如果我能正确理解你,你可以这样做:

Category parent = entityManager.find(Category.class, parentId);
Set<Category> children = parent.getChildren();

或者如果坚持使用查询

select child from Category parent join parent.children child where parent.id = :parentId

更新

我已经对它进行了测试,它在我身边起作用。这是我的分类impl:

@Entity
public class Category {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;


    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(joinColumns = {@JoinColumn(name = "cat_id")}, inverseJoinColumns = @JoinColumn(name = "inverse_cat_id"))
    private Set<Category> children = new HashSet<>();
    }

当我运行查询时,我得到了父母的孩子

PS (在您的例外情况下):您无法在查询中指定列。您只能指定实体(类)fields

PS2 :我看到你只需要孩子ID并更新查询

引用:

  

如果我需要根据market_category_id字段获取该怎么办?

通过此查询,您将根据父级的market_id

获取子级
select child from Category parent join parent.children child where parent.market_id = :parentId