场景: 我有一个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之前创建数据库和表的。所以我想存储过程将是更好的方法?
答案 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 INTO
或ON 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中所述对两列使用唯一约束。