2011-08-15 51 views
1

任何一个可以帮助我走出标准以下查询:以下SQL的标准是什么?

SELECT * From TableA Inner Join TableB On TableA.ID=TableB.ID 

我用以下标准

Criteria criteria = session.createCriteria(TableA.class); 
criteria.setFetchMode("TableB", FetchMode.JOIN); 

上述标准retrives两表数据尝试。

另外,如果我只需要TableA中的特定列,条件如何变化?

感谢您的时间。

编辑:TableA与TableB有一对多的关系。

+0

您有任何答案帮助吗? – Ali

回答

1

问题没有意义。在hibernate中,这两个表实际上应该是实体,在这种情况下它们之间会有关系。你是否试图随机加入两张表并获得结果?如果是这样,你必须使用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(); 

UPDATE:如果表A有1对多用表B,那么我觉得最容易使用的别名

Criteria criteria = getSession().createCriteria(TableA.class); 
criteria.createAlias("tableB","b"); 
criteria.add(Restrictions.eqProperty("id", "b.id"); 
criteria.list(); 

我希望这有助于。问候,

+0

对不起编辑问题,TableA到TableB存在一对多的关系。 – Ritesh

+0

@Ritesh,答案已更新。它没有经过测试,但应该给你关于你必须做的一般想法。 – Ali

+0

是的,你的方法是可行的,只需编辑addAlias即可创建活动。但是我使用的是Criteria criteria = getSession()。createCriteria(TableAlass).createCriteria(“tableB”); criteria.list();这对我来说很好。 – Ritesh

0

随着JOIN,你需要向Hibernate表明你只想要“根实体”,这是tableA。将以下内容添加到您的代码中:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);