Hibernate通过示例查询(来自Spring 3)

3

我已经创建了实体类 Adress, RoadCounty。一条Road在一个County中,一个Adress位于一条Road上。我想列出一个County中所有的Adresses。因此,在我的AdressService中,我这样说:

public List<Adress> AllAdresses(County county) {
  Adress adress = new Adress();
  Road road = new Road();
  road.setCounty(county);
  adress.setRoad(road);

  Example example = Example.create(adress);
  return (List<Adress>) adressDAO.query(Adress.class, example);
}

在我的AdressDAO中,我有一个query()方法:
public List query(Class<?> c, Example example) {
  return getSession().createCriteria(c).add(example).setMaxResults(100).list();
}

这将在我的数据库服务器上执行以下查询:
select this_.AdressId as AdressId2_0_, 
       this_.Description as Descript3_2_0_, 
       this_.DescriptionShort as Descript4_2_0_, 
       this_.HouseLetter as HouseLetter2_0_, 
       this_.HouseNr as HouseNr2_0_, 
       this_.RoadId as RoadId2_0_ 
from tblAdress this_ 
where (this_.HouseNr=0) 
limit 100

我原本期望它至少包含一些关于我的实体“County”以及与“tblRoad”进行内部连接的信息。 “tblRoad”具有一个主键“roadId”,因此我预期“this_.roadId”将与“tblRoad.roadId”连接,并且我预期“tblRoad.countyId”将设置为“County”的主键,即“countyId”。
为什么当我使用自己的实体类型时,此示例中的查询未正确构建?如果我只使用整数和字符串,则它们可以正常工作,但是实体无法正常工作。如何使类似这样的连接与我的实体一起工作?
1个回答

2

Hibernate文档中得知:

版本属性、标识符和关联被忽略。

就是这样了。


我好像在某个地方读到过这个,但我并不完全相信。难道我不能对此做些什么吗?是不是可以指定一些关于深度或者关联路径的内容之类的呢? - niklassaers
Query-By-Example有点像玩具。如果您需要编程查询构造,您应该真正使用完整的Criteria API(这就是QBE在底层以非常有限的方式使用的内容)。 - skaffman
啊哈,非常感谢您的提示。我会重新研究Hibernate参考文档并学习相关内容。我以为按示例查询是正确的方法,看起来很通用和好用。 :-) - niklassaers
1
太好了,我采纳了你的建议,现在正确的查询似乎是: return adressDAO.getSession().createCriteria(Adress.class).createCriteria("road").add(Restrictions.eq("county", county)).setMaxResults(100).list(); - niklassaers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接