Spring Data Вставить данные, когда запись еще не существует - PullRequest
0 голосов
/ 23 мая 2019

СЦЕНАРИЙ: У меня есть база данных MySQL, где у меня есть одна таблица с отображением пользователя и продукта.Мое приложение предлагает API, поэтому я должен знать, что сопоставление не будет выполнено несколько раз.Поэтому я хочу проверить, сопоставлены ли уже два идентификатора (пользователя и продукта).

ПРОБЛЕМА:

У меня есть запрос от здесь где я ожидаю логическое значение, которое показывает мне, если запись уже существует.

@Query(value ="SELECT case when count(id) > 0 then true else false end FROM user_product_matching WHERE user_id=:userId AND product_id=:productId", nativeQuery = true)
Boolean productAlreadyAdded(@Param("userId") Long userId,@Param("productId") Long productId);

Я получаю ошибку:

java.math.BigInteger не может быть приведен к java.lang.Boolean

Хотя я могуне запускаю это прямо сейчас, моя цель - написать ОДИН естественный запрос в spring, где я могу в результате этого запроса выполнить сценарий, если еще, где может выполнить вставку или пропустить.Возможно ли это и как мне написать запрос?

РЕДАКТИРОВАТЬ: Я забыл упомянуть, что это должно работать также из док-контейнеров, где Spring и базы данных не создаются Spring,Так что я думаю, что хранимые процедуры будут лучшим способом?

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Как раз этот вопрос обсуждался и в этой теме . В зависимости от желаемого поведения вы можете использовать что-то вроде

INSERT IGNORE INTO table
0 голосов
/ 23 мая 2019

Возможно, это потому, что логические значения представлены в Битовых значениях (0 или 1).Я думаю, вы могли бы упростить задачу, когда запросите счетчик событий, а затем сравните числовые значения.

Вы можете сделать что-то вроде этого:

@Query(value ="SELECT count(id) FROM user_product_matching WHERE user_id=:userId AND product_id=:productId", nativeQuery = true)
int productAlreadyAdded(@Param("userId") Long userId,@Param("productId") Long productId);

тогда в своем кодеспросить

if (productAlreadyAdded(userID, productID) > 0)
{
   ...
}

РЕДАКТИРОВАТЬ: Вы должны быть осторожны с запросами БД для таких простых вопросов.Вы можете столкнуться с проблемами производительности, когда этот простой метод часто вызывается.

Было бы лучше, если бы вы избегали повторяющихся записей в этой таблице.Вы можете использовать уникальные ограничения для двух столбцов, как описано здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...