Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个sql查询,用于检查唯一的_Java_Sql_Postgresql_Spring Mvc - Fatal编程技术网

Java 一个sql查询,用于检查唯一的

Java 一个sql查询,用于检查唯一的,java,sql,postgresql,spring-mvc,Java,Sql,Postgresql,Spring Mvc,我有一个SpringMVC应用程序,在注册表中我有一个区域,用于存放电子邮件和姓名 在注册之前,我用服务层中的以下代码检查数据库中的所有字段是否唯一(我使用的是spring data) 但我如何知道哪个参数不是唯一的名称或电子邮件 提前感谢 顺便说一句,我用以下代码解决了这个问题 @Override public Optional<String> isUnuque(final Users user) { final Users dbUser = this.re

我有一个SpringMVC应用程序,在注册表中我有一个区域,用于存放电子邮件和姓名

在注册之前,我用服务层中的以下代码检查数据库中的所有字段是否唯一(我使用的是
spring data

但我如何知道哪个参数不是唯一的名称或电子邮件

提前感谢

顺便说一句,我用以下代码解决了这个问题

@Override
    public Optional<String> isUnuque(final Users user) {
        final Users dbUser = this.repository.findByEmailOrName(user.getEmail(), user.getName());
        if (dbUser != null) {
            if (user.getEmail().equals(dbUser.getEmail())) {
                return Optional.of("Not unique email");
            } else {
                return Optional.of("Not unique name");
            }
        }
        return Optional.empty();
    }
@覆盖
公共可选isUnuque(最终用户){
最终用户dbUser=this.repository.findByEmailOrName(user.getEmail(),user.getName());
if(dbUser!=null){
if(user.getEmail().equals(dbUser.getEmail())){
返回可选的.of(“非唯一电子邮件”);
}否则{
返回可选的.of(“非唯一名称”);
}
}
返回可选的.empty();
}
但是,如果有任何sql查询不需要在服务层中进行双重检查就可以准确地执行我想要的操作,请将其写在下面

select 'name' from users where name = 'dd'
union all
select 'email' from users where name = 'ddd'@mail.ru

我不是java专家,但作为一名数据库人员,我想说一个更好的方法是对表中的
name
email
强制执行
UNIQUE
约束,并处理异常,无论应用程序如何,它都能保持数据的完整性

另一个选项是获取带有给定参数的电子邮件和姓名的计数

SELECT count(CASE 
            WHEN name = :p_name
                THEN 1
            END) AS name_count
    ,count(CASE 
            WHEN email = :p_email
                THEN 1
            END) AS email_count
FROM users;
COUNT
函数不计算空值,因此当
CASE
中的条件为false(默认情况下
NULL
)时,它会将0添加到计数中。因此,根据现有的值,查询会将
name\u count
email\u count
返回为0或1,您应该能够在代码中使用这些值

select 'name' from users where name = 'dd'
union all
select 'email' from users where name = 'ddd'@mail.ru
SELECT count(CASE 
            WHEN name = :p_name
                THEN 1
            END) AS name_count
    ,count(CASE 
            WHEN email = :p_email
                THEN 1
            END) AS email_count
FROM users;