任何人都可以通过Criteria帮我解决以下问题:
SELECT * From TableA Inner Join TableB On TableA.ID=TableB.ID
我正在尝试使用以下条件
Criteria criteria = session.createCriteria(TableA.class);
criteria.setFetchMode("TableB", FetchMode.JOIN);
以上标准会同时检索表格数据。
此外,如果我只需要TableA中的特定列,那么标准将如何更改?
感谢您的时间。
编辑:TableA与TableB有一对多的关系。
答案 0 :(得分:1)
问题没有意义。在hibernate中,2个表实际上应该是实体,在这种情况下,它们之间会有关系。您是否尝试随机加入2个表并获得结果?如果是这样,你必须使用sql并使用ResultTransformer
将结果转换为对象。
private ResultTransformer getResultsTransformer()
{
ResultTransformer transformer = new AliasToBeanResultTransformer(
MyResultBean.class) {
@Override
public Object transformTuple(Object[] values, String[] aliases)
{
MyResultBean row = new MyResultBean();
for (int i = 0; i < aliases.length; i++)
{
row.set(aliases[i], values[i]);
}
return (row);
}
};
return transformer;
}
请按以下方式调用:
Query q = session.createSQLQuery(sql);
q.setResultTransformer(getResultsTransformer());
List<MyResultBean> list = q.list();
更新:如果表A与表B具有1对多,那么我发现使用Alias最简单
Criteria criteria = getSession().createCriteria(TableA.class);
criteria.createAlias("tableB","b");
criteria.add(Restrictions.eqProperty("id", "b.id");
criteria.list();
我希望这会有所帮助。的问候,
答案 1 :(得分:0)
使用JOIN
,您需要向Hibernate表明您只需要“root实体”,即tableA。将以下内容添加到您的代码中:
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);