spring boot 整合jpa進(jìn)行數(shù)據(jù)查詢時(shí)報(bào)result returns more than one elements

新人小白記錄自己的采坑記錄

springboot整合jpa步驟:

(一)添加依賴

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

(二)配置文件添加配置

spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.ddl-auto:不同的參數(shù)對(duì)應(yīng)不同的建表更表規(guī)則,開始的時(shí)候選擇create-drop,導(dǎo)致每次重啟項(xiàng)目,原來(lái)的數(shù)據(jù)就消失不見。

create:每次加載都會(huì)刪除上一次的生成的表,然后根據(jù)你的model類再重新來(lái)生成新表,哪怕兩次沒有任何改變也要這樣執(zhí)行,這就是導(dǎo)致數(shù)據(jù)庫(kù)表數(shù)據(jù)丟失的一個(gè)重要原因。
create-drop:每次加載時(shí)根據(jù)model類生成表,但是sessionFactory一關(guān)閉,表就自動(dòng)刪除。
update:最常用的屬性,第一次加載hibernate時(shí)根據(jù)model類會(huì)自動(dòng)建立起表的結(jié)構(gòu)(前提是先建立好數(shù)據(jù)庫(kù)),以后加載hibernate時(shí)根據(jù)model類自動(dòng)更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會(huì)刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會(huì)被馬上建立起來(lái)的,是要等應(yīng)用第一次運(yùn)行起來(lái)后才會(huì)。
validate:每次加載時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫(kù)中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,但是會(huì)插入新值。

(三)創(chuàng)建bean

@Entity
@Table(name="user_test")
public class UserTest {
    @Id
    @GeneratedValue      //自增
    private Long id;
    @Column(nullable = false)     //是否可為空
    private String name;
    @Column(nullable = false)
    private Integer age;
     //省略get和set

(四)創(chuàng)建數(shù)據(jù)接口

public interface UserTestDao extends JpaRepository<UserTest,Long> {

    UserTest findByName(String name);

    List<UserTest> findByNameAndAge(String name, Integer age);

    @Query("from UserTest u where u.name=:name")
    UserTest findUser(@Param("name") String name);
}

(五)調(diào)用方法

UserTest userTests= userTestDao.findByName(userName);
System.out.println("獲取到的用戶信息是:"+userTests);

報(bào)錯(cuò)如下:result returns more than one elements


報(bào)錯(cuò)截圖

(六)原因分析

報(bào)錯(cuò)信息提示結(jié)果返回多個(gè)元素,我們打開數(shù)據(jù)庫(kù)查看數(shù)據(jù)表中的數(shù)據(jù)發(fā)現(xiàn)


jpa根據(jù)實(shí)體類自動(dòng)生成表

表中用戶名為aaaa的用戶有兩個(gè),查詢?cè)撚脩舻臅r(shí)候,返回的數(shù)據(jù)有多個(gè),而我們打印的事一個(gè)userTest,系統(tǒng)不知道選擇打印哪一個(gè),所以導(dǎo)致報(bào)錯(cuò),以此類推,如果查詢表中唯一存在的數(shù)據(jù),是不是正常顯示?通過(guò)測(cè)試發(fā)現(xiàn),查找如idea、ceshi、zhaohj等數(shù)據(jù)時(shí),可以正常打印

(七)解決優(yōu)化

將原來(lái)的

UserTest  findByName(String name);

改成

 List<UserTest>   findByName(String name);

查找優(yōu)化

           if (userTests.size() != 0) {
                if (userTests.size() > 1) {
                    System.out.println("獲取到的用戶信息是:" + userTests.get(1));
                } else {
                    System.out.println("獲取到的用戶信息是:" + userTests);
                }
            } else {
                Random random = new Random();
                userTestDao.save(new UserTest(userName, random.nextInt(100)));
            }
查找aaaa的時(shí)候,打印第一個(gè)數(shù)據(jù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容