Spring data jpa存储库find即使数据存在于数据库中也返回null

问题描述 投票:0回答:3

我正在使用 Spring Data JPA,面临问题,因为即使记录存在于数据库中,结果也总是为 NULL。

我尝试调试 spring 代码并检查语句是否正确创建。语句已正确创建,参数也已正确填充。

配置:- Spring-boot = 2.0.5.RELEASE

Oracle DB = Oracle 数据库 11g 版本 11.2.0.2.0 - 64 位

POM

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc7</artifactId>
        <version>12.1.0</version>
    </dependency>
</dependencies>

实体类:

@Entity()
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "user_Sequence")
    @SequenceGenerator(name = "user_Sequence", sequenceName = "USER_SEQ")
    private Long id;
    
    @Column(unique=true)
    private String userName;
    
    private String password;
    //getter & setter

存储库类

@Repository
public interface UserRepository extends 
org.springframework.data.repository.CrudRepository<User, Long>{

    User findByUserName(String userName);
    
    User save(User user);
}

服务等级

@Service("loginService")
public class LoginService implements ILoginService {

    @Autowired
    UserRepository userRepository;
    
    @Override
    public boolean isValidUser(String userName, String password) {
        User user = userRepository.findByUserName(userName);
        if(user != null && user.getUserName().equals(userName) && user.equals(password)){
            return true;
        } else {
            return false;
        }
    }
}

调试截图:- Debug Screenshot parameter value is

SQL 形成:-

select user0_."id" as id1_2_, user0_."password" as password2_2_, user0_."user_name" as user_name3_2_ from "user" user0_ where user0_."user_name"=?

如果我在数据库中运行相同的查询,结果是:- Result Screenshot

spring oracle spring-boot spring-data-jpa
3个回答
0
投票

由于您没有使用列名称作为字段名称,因此它需要知道要映射到实体中的内容。

将您的字段更改为

user_name
或更改:

@Column(unique=true)
private String userName;

@Column(name="user_name", unique=true)
private String userName;

因此它将能够知道它引用的是哪一列;

https://www.concretepage.com/spring-5/spring-data-crudrepository-example


0
投票

在存储库中使用 findByNameEqualsAndStatus


0
投票

以下是对我有用的事情。我正在使用 Oracle 19C 和 org.hibernate.dialect.Oracle12cDialect。

grant all on <schema>.<table> to <user>;
grant all on <schema>.<sequence> to <user>;
© www.soinside.com 2019 - 2024. All rights reserved.