遵循SQL的标准是什么?

时间:2011-08-15 21:41:47

标签: java hibernate jpa-2.0 hibernate-criteria

任何人都可以通过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有一对多的关系。

2 个答案:

答案 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);