【问题标题】:Spring Data Insert Data when entry not yet existsSpring Data 在条目尚不存在时插入数据
【发布时间】:2019-05-23 11:52:48
【问题描述】:

场景: 我有一个 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 中编写一个原生查询,我可以在其中使用此查询的结果来执行 if else case 场景,其中 a 可以执行插入或跳过。 这可能吗?我该如何编写查询?

编辑: 我忘了提到这也必须在 docker 容器中工作,其中数据库和表不是由 spring 创建的。所以我猜存储过程会是更好的方法吗?

【问题讨论】:

    标签: java sql spring-data-jpa


    【解决方案1】:

    显然this thread 也讨论了这个问题。根据想要的行为,您可以使用类似

    INSERT IGNORE INTO table
    

    【讨论】:

      【解决方案2】:

      我发现这篇文章:Spring Data JPA custom insert query 对我有用。 它在实体类中使用@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
      

      【讨论】:

        【解决方案3】:

        这是因为布尔值在数据库中表示为位(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 所述,您可以对两列使用唯一约束。

        【讨论】:

        • 是的,我认为查询条目是否已存在是一种不好的做法。问题是我必须从 dockerfile 中创建表。所以我想如果我注释我的模型,这将不起作用。我在想 aber 用 EXIST 或类似的东西定义一个复杂的查询
        • 我不熟悉“从 dockerfile 中创建表”,但此注释的结果将是数据库中的本机约束。因此,当您能够创建表时,您也应该能够创建约束。不好的是你会在 SQLExceptions 中运行...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        • 2015-07-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2021-10-26
        相关资源
        最近更新 更多