用Hibernate Criteria查询ManyToMany关系

Dan*_*iuc 10 java sql many-to-many hibernate criteria

我不确定如何描述这个问题,所以我认为一个例子是问我问题的最佳方式:

我有两个表与manyToMany关系:

DriversLicence < - > LicenceClass

LicenceClass是"Car","Motorbike"和"Medium Rigid"之类的东西.

使用Hibernate Criteria,我怎样才能找到同时拥有"Car"和"Motorbike"LicenceClasses的所有许可证?

更新12/11/2008我发现使用自定义ResultTransformer可以轻松实现这一点.但问题是结果转换器仅在查询返回其结果后才应用,它实际上不会成为SQL的一部分.所以我想我现在的问题是"你能做我最初在SQL中描述的内容吗?是否有Hibernate Criteria模拟?"

小智 6

以下是我最终使用HQL实现它的方法:

public List<DriversLicence> findDriversLicencesWith(List<LicenceClass> licenceClasses) {
    String hqlString = "select dl from DriversLicenceImpl dl where 1=1 ";
    for (int i = 0; i < licenceClasses.size(); i++) {
        hqlString += " and :licenceClass" + i + " = some elements(dl.licenceClasses)";
    }

    Query query = getSession().createQuery(hqlString);
    for (int i = 0; i < licenceClasses.size(); i++) {
        query.setParameter("licenceClass" + i, licenceClasses.get(i));
    }
    return query.list();
}
Run Code Online (Sandbox Code Playgroud)

或者使用带有sqlRestriction的Hibernate Criteria:

for (LicenceClass licenceClass : licenceClasses) {               
    criteria.add(Restrictions.sqlRestriction("? = some(select " + LicenceClass.PRIMARY_KEY + " from " +
                    LICENCE_CLASS_JOIN_TABLE + "  where {alias}." +
                    DriversLicence.PRIMARY_KEY + " = " + DriversLicence.PRIMARY_KEY + ")",
                    licenceClass.getId(), Hibernate.LONG));
}
Run Code Online (Sandbox Code Playgroud)

LICENCE_CLASS_JOIN_TABLE是hibernate生成的表的名称,用于支持driversLicence和LicenceClass之间的多对多关系.