Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠条件多对多_Java_Hibernate_Many To Many_Criteria - Fatal编程技术网

Java 休眠条件多对多

Java 休眠条件多对多,java,hibernate,many-to-many,criteria,Java,Hibernate,Many To Many,Criteria,我有两个具有多对多关系的实体: @Entity @Table(name = "items") public class Item implements Comparable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "item_id") private Integer itemId; @ManyToMany(cascade = CascadeType.PERSIST, fetch = Fe

我有两个具有多对多关系的实体:

@Entity
@Table(name = "items")
public class Item implements Comparable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "item_id")
private Integer itemId;

@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "items_criteria",
        joinColumns = @JoinColumn(name = "item_id"),
        inverseJoinColumns = @JoinColumn(name = "filter_criterion_id"))
private List<FilterCriterion> filterCriteria;

}
@实体
@表(name=“items”)
公共类项实现了可比性{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“item\u id”)
私有整数itemId;
@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)
@JoinTable(name=“items\u标准”,
joinColumns=@JoinColumn(name=“item_id”),
inverseJoinColumns=@JoinColumn(name=“filter\u-criteria\u-id”))
私有列表过滤器标准;
}

@实体
@表(name=“过滤器标准”)
公共类过滤器标准{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“filter\u criteria\u id”)
私有整数过滤器标准;
@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)
@JoinTable(name=“items\u标准”,
joinColumns=@JoinColumn(name=“filter\u-criteria\u-id”),
inverseJoinColumns=@JoinColumn(name=“item_id”))
私人清单项目;
}
我需要在ItemDao类中编写一个函数,该函数返回集合中所有元素都作为参数给出的项列表。在下面的示例中,我使用了Restrictions.In,因此结果甚至包含那些只包含列表中作为参数给出的一个FilterCriterion的项。我只需要在结果中包含这些项,它们包含参数列表中的所有元素

public List<Item> getItems(List<FilterCriterion> currentFilterCriteria) {

    Criteria criteria = ht.getSessionFactory().getCurrentSession().createCriteria(Item.class);
    List<Integer>currentFilterCriteriaId = new ArrayList<Integer>();
    for(FilterCriterion criterion : currentFilterCriteria){
        currentFilterCriteriaId.add(criterion.getFilterCriterionId());
    }
    if(!currentFilterCriteriaId.isEmpty()){
        criteria.createAlias("filterCriteria", "f");
        criteria.add(Restrictions.in("f.filterCriterionId", currentFilterCriteriaId));
    }
    return criteria.list();
}
public List getItems(List currentFilterCriteria){
Criteria Criteria=ht.getSessionFactory().getCurrentSession().createCriteria(Item.class);
ListcurrentFilterCriteriaId=new ArrayList();
用于(过滤标准:currentFilterCriteria){
currentFilterCriteriaId.add(criteria.getFilterCriterianid());
}
如果(!currentFilterCriteriaId.isEmpty()){
标准。createAlias(“filterCriteria”、“f”);
标准。添加(限制。在(“f.filterCriterionId”,currentFilterCriteriaId));
}
返回条件。list();
}

首先,您必须修复映射。这里没有双向的多人关联,而是两个不相关的单向多人关联。通过使用mappedBy属性,一侧必须是相反的一侧:

@ManyToMany(mappedBy = "filterCriteria")
private List<Item> items;

您应该使用一个集合来保存您的条件ID,而不是一个列表,以确保它不包含重复项(这将导致结果不正确)。

感谢您的帮助,我修复了映射,但在我的问题中,我描述了比实际情况更简单的情况。函数getItems实际上接受了更多参数,并且不仅包含FilterCriterion的条件限制。所有其他限制都很有效,我不知道如何为所有这些编写HQL查询。你能帮我设置一个限制吗?
@ManyToMany(mappedBy = "filterCriteria")
private List<Item> items;
select i from Item i
where :criteriaIdSetSize = (select count(c.id) from Item i2
                             inner join i2.filterCriteria c
                             where c.id in :criteriaIdSet
                             and i2 = i)