使用Hibernate标准API查询多对多关系

使用Hibernate标准API查询多对多关系,hibernate,activerecord,nhibernate,Hibernate,Activerecord,Nhibernate,我有以下多对多关系:文件1---*文件\u保险公司----1保险公司。我正在尝试使用标准API(活动记录)查询此关系,以获取满足所有指定保险公司的文件(获取所有文件,其中insurance.Id==2和insurance.Id==3) 映射文件(零件): DetachedCriteria dc = DetachedCriteria.For<File>(); dc.SetResultTransformer(new DistinctRootEntityResultTransformer(

我有以下多对多关系:
文件1---*文件\u保险公司----1保险公司
。我正在尝试使用标准API(活动记录)查询此关系,以获取满足所有指定保险公司的文件(获取所有文件,其中
insurance.Id==2
insurance.Id==3

映射文件(零件)

DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
dc.CreateCriteria("Insurers").Add(Expression.Eq("Id", long.Parse("2")));
dc.CreateCriteria("Insurers").Add(Expression.Eq("Id", long.Parse("3")));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
dc.CreateCriteria("Insurers").Add(Expression.And(Expression.Eq("Id", long.Parse("3")), Expression.Eq("Id", long.Parse("2"))));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
dc.CreateAlias("Insurers", "i").Add(Expression.Eq("i.Id", long.Parse("2"))).Add(Expression.Eq("i.Id", long.Parse("3")));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
List<long> insurerIds = new List<long>();
insurerIds.Add(2);
insurerIds.Add(3);
dc.CreateCriteria("Insurers").Add(Expression.In("Id", insurerIds));
List<File> searchResults = File.FindAll(dc).ToList<File>();
文件 结果列表为空(但不应为空)

下一个别名选项

DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
dc.CreateCriteria("Insurers").Add(Expression.Eq("Id", long.Parse("2")));
dc.CreateCriteria("Insurers").Add(Expression.Eq("Id", long.Parse("3")));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
dc.CreateCriteria("Insurers").Add(Expression.And(Expression.Eq("Id", long.Parse("3")), Expression.Eq("Id", long.Parse("2"))));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
dc.CreateAlias("Insurers", "i").Add(Expression.Eq("i.Id", long.Parse("2"))).Add(Expression.Eq("i.Id", long.Parse("3")));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
List<long> insurerIds = new List<long>();
insurerIds.Add(2);
insurerIds.Add(3);
dc.CreateCriteria("Insurers").Add(Expression.In("Id", insurerIds));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc=DetachedCriteria.For();
dc.SetResultTransformer(新的distinctrotentyResultTransformer());
Add(Expression.Eq(“i.Id”,long.Parse(“2”)).Add(Expression.Eq(“i.Id”,long.Parse(“3”));
List searchResults=File.FindAll(dc.ToList();
结果列表再次为空-奇怪

下一次尝试

DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
dc.CreateCriteria("Insurers").Add(Expression.Eq("Id", long.Parse("2")));
dc.CreateCriteria("Insurers").Add(Expression.Eq("Id", long.Parse("3")));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
dc.CreateCriteria("Insurers").Add(Expression.And(Expression.Eq("Id", long.Parse("3")), Expression.Eq("Id", long.Parse("2"))));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
dc.CreateAlias("Insurers", "i").Add(Expression.Eq("i.Id", long.Parse("2"))).Add(Expression.Eq("i.Id", long.Parse("3")));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc = DetachedCriteria.For<File>();
dc.SetResultTransformer(new DistinctRootEntityResultTransformer());
List<long> insurerIds = new List<long>();
insurerIds.Add(2);
insurerIds.Add(3);
dc.CreateCriteria("Insurers").Add(Expression.In("Id", insurerIds));
List<File> searchResults = File.FindAll(dc).ToList<File>();
DetachedCriteria dc=DetachedCriteria.For();
dc.SetResultTransformer(新的distinctrotentyResultTransformer());
列表被保险人ID=新列表();
被保险人。添加(2);
被保险人。添加(3);
dc.CreateCriteria(“承保人”).Add(Expression.In(“Id”,insurerIds));
List searchResults=File.FindAll(dc.ToList();
这在某种程度上是可行的,但结果集包含了一个所有可能的选项(或)-这不是一个精确的匹配。

这一直是-请参阅下面我对它的看法。hibernate站点似乎已关闭,但请查看《hibernate用户指南》第11章的副本

public List<Files> findFilesForInsurers(Insurer... insurers) {
    StringBuilder hql = new StringBuilder();
    hql.append("select f from Files ff where 1=1 ");
    for (int i = 0; i < insurers.length; i++) {
        hql.append(String.format(" and :i%d in elements(ff.insurers)", i));
    }
    Query query = getSession().createQuery(hql.toString());
    for (int i = 0; i < insurers.length; i++) {
        query.setParameter("i" + i, insurers[i]);
    }
    return query.list();
}
我怀疑您试图实现的SQL是这样的,尽管我不能确切地告诉您上面的HQL转换成了什么

select f.* from files f
    left outer join files_insurers fi1 on fi1.files_id = f.id
    left outer join files_insurers fi2 on fi2.files_id = f.id
where 1 = 1
    and fi1.insurers_id = :i1
    and fi2.insurers_id = :i2;
这是我的看法,请看下面。hibernate站点似乎已关闭,但请查看《hibernate用户指南》第11章的副本

public List<Files> findFilesForInsurers(Insurer... insurers) {
    StringBuilder hql = new StringBuilder();
    hql.append("select f from Files ff where 1=1 ");
    for (int i = 0; i < insurers.length; i++) {
        hql.append(String.format(" and :i%d in elements(ff.insurers)", i));
    }
    Query query = getSession().createQuery(hql.toString());
    for (int i = 0; i < insurers.length; i++) {
        query.setParameter("i" + i, insurers[i]);
    }
    return query.list();
}
我怀疑您试图实现的SQL是这样的,尽管我不能确切地告诉您上面的HQL转换成了什么

select f.* from files f
    left outer join files_insurers fi1 on fi1.files_id = f.id
    left outer join files_insurers fi2 on fi2.files_id = f.id
where 1 = 1
    and fi1.insurers_id = :i1
    and fi2.insurers_id = :i2;