2012-09-02 103 views
0

我做这个查询:如何通过id来避免hibernate默认命令?

String query = FROM Account acc WHERE acc.id = ? OR acc.id = ? or acc.id = ?... 

我有ID的数组:

long[] accountIds= {327913,327652,327910,330511,330643}; 

然后我让

getHibernateTemplate().find(query, accountIds); 

我看到帐户列表我从该查询返回是:

327652,327910,327913,330511,330643,显然,由我排序d。

有没有机会按照我写的ID的顺序把它取回来?

会感谢所有帮助

回答

1

你不能做到这一点的查询级别。
您可以从数据库加载后进行排序,这样的事情

long[] accountIds= {327913,327652,327910,330511,330643}; 
    List<Account> afterHql = getHibernateTemplate().find(query, accountIds); 
    List<Account> sortedList = new ArrayList<Acount>(); 
    for (long id : accountIds) 
    { 
     for (Account account : afterHql) 
     { 
      if (account.getId() == id) 
      { 
       sortedList.add(account); 
      } 
     } 
    } 
+0

thanx为回应...我希望我可以避免这种表现..因为大多数时候不是很少的ID .. – Julia

2

您可能需要使用Criteria及其addOrder

事情是这样的:

DetachedCriteria cr = DetachedCriteria.forClass(entityClass); 
//Add expressions or restrictions to your citeria 
//And add your ordering 
cr.addOrder(Order.asc("yourID")); 
List<T> ls = getHibernateTemplate().findByCriteria(cr); 
return ls; 
+0

比你的回应,但是,即时通讯不捕捉如何定义这个其他编号顺序,我以前在哪里定义什么是“yourId”,这是不同于简单的ID?感谢名单! – Julia

+0

因为我不知道你的'entityClass',所以我通常使用这些术语。通过'entityClass'我指的是你声明为“@ Entity”的类,即你想从表中检索一些数据的类。 'yourId'我的意思是你想根据它进行排序的属性。 –

+0

好吧,我认为你是这么说的,但这意味着你不太明白我需要什么,不存在我想要排序的财产。我希望它按照我在查询中写入这些IDS的方式进行排序:)或将ID传递给IN()子句....但是,似乎它不可能。 – Julia

0

这是不可能通过OR QueryRestrictions.in()提供任何实体获取结果。正如您在开启这种查询时所遇到的情况一样,它会以明智的方式搜索结果。所以它只会让你的结果更加明智。您可以使用标准在asc或desc中更改顺序。如果您想要输入结果,请输入第二个答案是唯一的选择。

0

您只能按查询返回的列值按数据类型定义的顺序进行排序。预先订购您提供的ID并不是更好,并且通过ID对查询结果进行排序,以便它们以相同的顺序出现?

+0

对不起,但是,我仍然按照这种方式让它们按对象ID排序,我不知道我以那种方式获得了什么?或者我错过了你的观点。 – Julia