如何修复JPA /休眠错误,找不到表信息?

时间:2019-09-30 20:46:25

标签: java spring hibernate spring-boot

我已经使用JPA / Hibernate将数据库连接到我的主要Java应用程序。我可以通过Spring启动项目从Microsoft SQL表添加/删除项目。虽然到了查看表中所有内容的时间,但是我得到了一个错误。我在下面附加了一些与项目相关的代码。

实体类:


import javax.persistence.*;

@Entity
@Table(name = "taddm")
public class AVSApplication {

    @Id
    @Column(name = "appcode")
    private String mAppCode;

    @Column(name = "acro")
    private String mAcronym;

    @Column(name = "appname")
    private String mAppName;


    //Constructor
    public AVSApplication(String mAppCode, String mAcronym, String mAppName) {
        super();
        this.mAppCode = mAppCode;
        this.mAcronym = mAcronym;
        this.mAppName = mAppName;
    }


    //Default Constructor
    public AVSApplication () {

    }


    //Getters
    public String getmAppCode() {
        return mAppCode;
    }

    public String getmAcronym() {
        return mAcronym;
    }
    public String getmAppName() {
        return mAppName;
    }



    //Setters
    public void setmAcronym(String mAcronym) {
        this.mAcronym = mAcronym;
    }
    public void setmAppCode(String mAppCode) {
        this.mAppCode = mAppCode;
    }

    public void setmAppName(String mAppName) {
        this.mAppName = mAppName;
    }




}

控制器:

//Select
        @GetMapping("/select-me")
        public String selectApplication() {

            System.out.println(mAppRepo.findAll());
            System.out.println(mAppRepo.findById("3A0"));

           return "tier";
        }

错误:

Hibernate: select avsapplica0_.appcode as appcode1_0_, avsapplica0_.acro as acro2_0_, avsapplica0_.appname as appname3_0_ from taddm avsapplica0_
[]
Hibernate: select avsapplica0_.appcode as appcode1_0_0_, avsapplica0_.acro as acro2_0_0_, avsapplica0_.appname as appname3_0_0_ from taddm avsapplica0_ where avsapplica0_.appcode=?
Optional.empty

回购:

@Repository
public interface AppRepository extends JpaRepository<AVSApplication, String>{

     @Override
     List<AVSApplication> findAll();

}

表名:

appcode (primary key)
acro
appname

3 个答案:

答案 0 :(得分:0)

我是这样认为的。它不是错误。实际上是有效的输出。您正在尝试查询(sysout)应用代码-不存在的“ 3A0”。我试图在本地复制相同的代码,并且可以通过查询不存在的应用程序代码来做到这一点,如下所示:

无效输入:

System.out.println(mAppRepo.findAll());
System.out.println(mAppRepo.findById("appcode"));

输出:

[com.example.demo.entity.AVSApplication@1640ad08]
Optional.empty

有效输入:

System.out.println(mAppRepo.findAll());
    System.out.println(mAppRepo.findById("abc"));

输出:

[com.example.demo.entity.AVSApplication@335bed5b]
Optional[com.example.demo.entity.AVSApplication@655967a5]

因此,请确保您要查询现有的有效条件。寻找拼写错误,然后重试。

答案 1 :(得分:0)

您不需要override下的findAll()默认JpaRepository方法。只需将存储库接口保留为空即可。

@Repository
public interface AppRepository extends JpaRepository<AVSApplication, String>{

}

答案 2 :(得分:0)

如您所显示,似乎代码中没有错误,它没有发现任何带有findById("your_key")键的内容,并且您没有该键的值。 您可以做的就是相应地检查该键是否有价值:

Optional<AVSApplication> optionalApp = mAppRepo.findById("3A0");
if (optionalApp.isPresent()) 
    {
        AVSApplication yourObject= optionalApp.get();
     } 
else 
    {
        //throw new exceptions or do whatever you want
    }

此外,从存储库中清除覆盖的findAll()方法