2015-11-04 24 views
0

我需要优化一个遍历多个对象的查询,并且我希望Spring Data能够让数据库处理它。我想用一个HashMap<String,String>,看起来像将整数转换为Spring数据中的字符串JPA查询

2134_9877, 9877 
2134_2344, 2344 
3298_9437, 9437 

结束了SQL是select convert(varchar,b.id)+'_'+convert(varchar,a.id)',a.id from t1 a join t2 b on a.jc = b.jc

到目前为止,我已经得到了无论-QL中,看起来像仓库:

@Query("SELECT new map (a.bkey, a.akey) FROM mergeTable a WHERE a.discr= ?1")

问题是,bkey不是唯一的,它只有在与akey配对时才是唯一的,而且我必须提供它的怪物才能让它们与下划线组合:2345_2177

我试图a.bkey.toString''+a.bkeynew String(a.bkey),只是string(a.bkey)(即最后给出了一个新的异常,但仍然无法正常工作),但春节不喜欢任何这些。我可以找到没有问题的问题,看来我不能使用SQLServer的convert()函数,因为这不是SQL。

如何在这个@Query中将整数连接为带有下划线的字符串? PS:使用在SQLServer中调试过的本机查询会在Hibernate中引发一些奇怪的别名异常,所以我认为'本土化'被预先确定为死胡同。

回答

1

如果我理解正确,'Whatever-QL'被称为JPQL,并且可以使用运算符CONCAT。只有使用它,因为它接受两个或更多参数取决于您正在运行的JPA版本。

这是答案。

JPA concat operator

+0

不幸的是,CONCAT不可用,直到2012年的SQLServer然而,在链接你送我看到的是,虽然2 +“串”不行,“” + 2 +'串'确实有效。既然你链接到另一个问题产生了这个提示,并且int/string转换是我的特定问题,我将选择你的答案作为解决方案。谢谢。 _不幸的是,现在我收到了一个不同的错误,所以我会问一个新问题。 – user1944491

1

你可以一个getter添加到您的实体是这样的:

public String getCombinedKey(){ 
    return a.akey + "_" + a.bkey; 
} 

的好处是,如果你愿意,你可以在这里处理空的和其他的东西,它更可重复使用的情况下,你需要这个在另一个地方。如果您只是在存储库中执行此操作,则必须每次都复制它。然后

您所查询的是:

@Query("SELECT new map (a.combinedKey, a.akey) FROM mergeTable a WHERE a.discr= ?1") 
+0

我知道这不是一件确定的事情,但我希望尽可能将连接推到后端。 SQLServer比Hibernate更有效。不过你的建议是一个很好的设计。 – user1944491