如何使用Hibernate的HQL和Criteria api表达此查询?

时间:2010-12-22 08:18:10

标签: hibernate

SELECT CITIES。* from CITIES,CITIES.STATE_ID IN(SELECT STATES.STATE_ID from STATES WHATES STATES.COUNTRY_ID = 78)

编辑:

以下是课程

Country.java

Integer id;
String name;

State.java

Integer id;
Integer countryId;
String name;

City.java

Integer id;
Integer stateId;
String name;

我正在努力让所有属于某个国家/地区的城市(例如,那个拥有其ID = 78的城市)

2 个答案:

答案 0 :(得分:3)

Criteria api适用于关系映射。如果城市,州或国家之间没有任何关系,则不能使用上述解决方案之类的内容。我有两个建议,首先你可以使用两个标准。

DetachedCriteria ownerCriteria = DetachedCriteria.forClass(State.class);
ownerCriteria.setProjection(Property.forName("id"));
ownerCriteria.add(Restrictions.eq("countryId", countryParam));


Criteria criteria = getSession().createCriteria(City.class);
criteria.add(Property.forName("stateId").in(ownerCriteria));

第二个是使用带交叉连接的hql。看看here

最后我认为用本机sql编写此查询会更好。 ;)

答案 1 :(得分:0)

当您不显示映射和/或域类时很难说。 但是,您不需要此查询的子查询(尽管它将返回相同的结果,并且完全没问题。)

你可以这样做:

ICriteria crit = session.CreateCriteria <City>();
crit.CreateAlias ("State", "s");
crit.CreateAlias ("s.Country", "cntry");
crit.Add (Expression.Eq ("cntry.Id", 78));

var results = crit.List<City>();