2011-10-23 68 views
0

我有一个通过DAO执行查询N次的循环。在我的情况下,我有一个属性值为“123456789”的对象。在第一个回合中,它对特定的表执行查询,以获得列C1等于“123456789”的所有记录。SQL最长前缀字符串

在第二回合中,它会在同一张表上执行一个查询,以获得所有列C1等于“12345678”的记录。依此类推,直到找到具有最长前缀的记录。

我认为,而不是多次执行此查询,为什么不执行另一个查询只有一次,它需要作为参数字符串“123456789”并返回具有列C1这是最长的前缀“123456789 ”。但我不知道如何用Hibernate来做到这一点(如果可能的话),或者如果你有另一种解决方案。我正在使用MySQL。

(我看了这个post但我想知道是否有办法做到这一点与Hibernate)

回答

2

您可以执行SQL这样的:

select * from table where 1234567 like concat(c1,'%') order by c1 desc limit 1; 

基本上你会从您的SQL中返回与给定参数匹配的最长值。如果你想要,你可以使用setMaxResults而不是limit和operator ||连接列,如:

... 
Query query = session.createQuery("from Prefixes where :parameter like Prefixes.prefix || '%' order by Prefixes.prefix desc"); 
query.setParameter("parameter", 1234567); 
query.setMaxResults(1); 
Prefixes p = (Prefixes)query.uniqueResult(); 
... 
+0

感谢您的答案,它的工作原理!但是,我有两个问题:首先,使用concat()和||之间有什么区别?另外,这个HQL语句是否可以在不同的DBMS之间移植? –

+0

据我所知,||是休眠状态,这意味着将被转换到每个数据库与他们自己的功能。 concat将通过并将用于特定数据库。 –