使用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;