当条目不存在时,Spring数据插入数据

时间:2019-05-23 11:52:48

标签: java sql spring-data-jpa

场景: 我有一个MySQL数据库,其中有一个表,其中包含用户和产品的映射。我的应用程序提供了一个api,因此我必须意识到映射不会多次完成。 因此,我想检查两个ID(用户和产品)是否已经映射。

问题:

我有一个来自here的查询,我期望一个布尔值可以显示是否存在条目。

@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中编写一个natve查询,在这里我可以查询结果执行if情况下可以执行插入或跳过的情况。 这可能吗,我该怎么写查询?

编辑: 我忘了提到,他还必须在docker容器中工作,在docker容器中不是在spring之前创建数据库和表的。所以我想存储过程将是更好的方法?

3 个答案:

答案 0 :(得分:1)

同样,在this thread中也讨论了这个问题。根据所需的行为,您可以使用类似的

INSERT IGNORE INTO table

答案 1 :(得分:1)

我发现了这篇文章:phonetic algorithms适用于我。 它在实体标题@SQLInsert(sql = "INSERT IGNORE INTO users(first_name, last_name, email) " + "VALUES (?, ?, ?)" )上方的实体类中使用public class User {

    @Entity
    @Table(name = "users")
    @SQLInsert(sql = "INSERT IGNORE INTO users(first_name, last_name, email) " + "VALUES (?, ?, ?)" )
    public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    .
    .
    .

您也可以像以下示例一样使用REPLACE INTOON DUPLICATE KEY UPDATE

REPLACE INTO Table_name
SET column1 = value1,
column2 = value2;

INSERT INTO Table_name (value1, value2, value3)
VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE column1 = value1+1
WHERE condition

答案 2 :(得分:0)

可能是因为布尔值在数据库中表示为Bit(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)
{
   ...
}

编辑:对于这样的简单问题,您应该小心使用数据库查询。经常调用此简单方法时,可能会遇到性能问题。

最好避免该表中的重复条目。您可以按照here中所述对两列使用唯一约束。