2015-11-04 2 views
0

Мне нужно оптимизировать запрос, который выполняет итерацию по нескольким объектам, и я хотел, чтобы Spring Data позволяла базе данных обрабатывать его. Я хочу, чтобы в конечном итоге с HashMap<String,String>, который выглядит какПреобразование целого в строку в Spring Data JPA Query

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.bkey и new String(a.bkey) и просто string(a.bkey) (что последний дает новое исключение, но все еще не работает), но весна не нравится ни один из них. Я не могу задать никаких вопросов, и, похоже, я не могу использовать функцию convert() SQLServer, поскольку это не SQL.

Как я могу объединить целые числа как строки с подчеркиванием в этом @Query?

PS: Используя собственный запрос, который был отлажен в SQLServer, выдает какое-то странное исключение псевдонимов в Hibernate, поэтому я думаю, что 'going native' предопределен быть тупиком.

ответ

1

Если я понял это правильно, «Whatever-QL» называется JPQL, и может использоваться оператор CONCAT. Только его использование, поскольку оно принимает два или более параметров, зависит от версии JPA, которую вы используете.

Вот ответ.

JPA concat operator

+0

К сожалению, CONCAT не доступен до SQLServer 2012 года Тем не менее, в ссылке, которую вы послали я увидел, что в то время как 2 + «строка» не работает «» + 2 + 'string' работает. Поскольку ваша ссылка на другой вопрос дала этот намек, и преобразование int/string было моим конкретным вопросом, я выберу ваш ответ в качестве решения. Благодарю. _К сожалению, теперь у меня другая ошибка, поэтому я задам новый вопрос. – user1944491

1

Вы можете добавить поглотитель к вашему лицу, как это:

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

Смежные вопросы