JPA原生SQL實(shí)現(xiàn)增刪改查的示例詳解
原生SQL
JPA除了對(duì)JPQL提供支持外,還對(duì)原生SQL語(yǔ)句也提供了支持。下面小節(jié)一起來(lái)看看吧。
查詢(xún)單個(gè)
示例代碼:
@Test
public void getSingle() {
EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 獲取連接
String sql = "select cid, cname, credit, end, num, start " +
"from yootk.course where cid = ?1";
Query query = entityManager.createNativeQuery(sql); // 預(yù)處理sql
query.setParameter(1, 1);
Course course = (Course) query.getSingleResult();
loggerFactory.info("【執(zhí)行結(jié)果】:{}",course ); // 執(zhí)行sql
JPAEntityFactory.close();// 關(guān)閉連接
}執(zhí)行結(jié)果:
java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class look.word.po.Course
意思是 query.getSingleResult() 不能轉(zhuǎn)換成 Course類(lèi)
修改代碼

執(zhí)行結(jié)果:
【執(zhí)行結(jié)果】:[1, Spring編程實(shí)戰(zhàn), 5, 2022-12-30, 88, 2022-09-19]
可以發(fā)現(xiàn),query.getSingleResult() 返回的是一個(gè)數(shù)組對(duì)象。不能轉(zhuǎn)換成Course也是正常的。后續(xù)文章會(huì)解決這個(gè)問(wèn)題
查詢(xún)多個(gè)
實(shí)例代碼:
@Test
public void getAllCourse() {
EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 獲取連接
String sql = "select cid, cname, credit, end, num, start " +
"from yootk.course ";
Query query = entityManager.createNativeQuery(sql); // 預(yù)處理sql
List list = query.getResultList();// 執(zhí)行sql
for (Object o : list) {
loggerFactory.info("【執(zhí)行結(jié)果】:{}", o);
}
JPAEntityFactory.close();// 關(guān)閉連接
}執(zhí)行結(jié)果:
【執(zhí)行結(jié)果】:[1, Spring編程實(shí)戰(zhàn), 5, 2022-12-30, 88, 2022-09-19]
【執(zhí)行結(jié)果】:[5, SpringCloud編程實(shí)戰(zhàn), 5, 2022-12-30, 88, 2022-09-19]
【執(zhí)行結(jié)果】:[6, SSM編程實(shí)戰(zhàn), 5, 2022-12-30, 88, 2022-09-19]
分頁(yè)模糊查詢(xún)
示例代碼:
@Test
public void getAllCourseSplit() {
int current = 2;
int lineSize = 3;
String keyWord = "%Spring%";
EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 獲取連接
String sql = "select cid, cname, credit, end, num, start " +
"from yootk.course where cname like :k1";
Query query = entityManager.createNativeQuery(sql); // 預(yù)處理sql
query.setFirstResult((current - 1) * lineSize); // 等同于 limit ?
query.setMaxResults(lineSize); // // 等同于 limit ?,?
query.setParameter("k1", keyWord);
List list = query.getResultList();// 執(zhí)行sql
for (Object o : list) {
loggerFactory.info("【執(zhí)行結(jié)果】:{}", o);
}
JPAEntityFactory.close();// 關(guān)閉連接執(zhí)行結(jié)果:
執(zhí)行的sql: select cid,cname,credit,end,num,start from yootk.course where cname like ? limit ?,?
count
統(tǒng)計(jì) 模糊匹配到的行數(shù)
// 統(tǒng)計(jì)行數(shù)
@Test
public void getAllCourseCount() {
String keyWord = "%Spring%";
EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 獲取連接
String sql = "select count(*) from yootk.course where cname like :k1";
Query query = entityManager.createNativeQuery(sql); // 預(yù)處理sql
query.setParameter("k1", keyWord);
loggerFactory.info("【執(zhí)行結(jié)果】:{}", query.getSingleResult());// 執(zhí)行sql
JPAEntityFactory.close();// 關(guān)閉連接
}執(zhí)行結(jié)果
執(zhí)行的sql: select count(*) from yootk.course where cname like ?
更新
例如:我們想把學(xué)分小于5的課程全部提高到5
注意到:我們當(dāng)前是未開(kāi)啟事務(wù)的,觀察程序執(zhí)行結(jié)果。
@Test
public void getUpdateCourse() {
// 例如:我們想把學(xué)分小于5的課程全部提高到5
EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 獲取連接
//entityManager.getTransaction().begin(); // 開(kāi)啟事務(wù)
String sql = "update yootk.course as c set c.credit = ?1 where c.credit <?2";
Query query = entityManager.createNativeQuery(sql); // 預(yù)處理sql
query.setParameter(1, 5);
query.setParameter(2, 5);
loggerFactory.info("【執(zhí)行結(jié)果】:{}", query.executeUpdate());// 執(zhí)行sql
//entityManager.getTransaction().commit(); // 提交事務(wù)
JPAEntityFactory.close();// 關(guān)閉連接
}執(zhí)行結(jié)果:
異常提示信息為:說(shuō)我們的 update / delete 操作需要事務(wù)的支持
把上敘代碼注釋掉的事務(wù),放開(kāi)執(zhí)行即可。

刪除指定id
示例代碼:
// 刪除指定id
@Test
public void deleteById() {
EntityManager entityManager = JPAEntityFactory.getEntityManager(); // 等同于 獲取連接
entityManager.getTransaction().begin(); // 開(kāi)啟事務(wù)
String deleteSql = "delete from yootk.course where cid = ?1";
Query query = entityManager.createNativeQuery(deleteSql);
query.setParameter(1, 1); // 預(yù)處理sql 賦值
loggerFactory.info("【執(zhí)行結(jié)果】:{}", query.executeUpdate());// 執(zhí)行sql
entityManager.getTransaction().commit(); // 提交事務(wù)
JPAEntityFactory.close();// 關(guān)閉連接
}執(zhí)行結(jié)果
執(zhí)行的sql: delete from yootk.course where cid = ?
新增
實(shí)例代碼:
@Test
public void addCourse() {
EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于獲取連接
entityManager.getTransaction().begin(); //開(kāi)啟事務(wù)
String addSql = "insert into yootk.course(cname, credit, end, num, start) " +
"value(:cname,:credit,:end,:num,:start )";
Query query = entityManager.createNativeQuery(addSql);
query.setParameter("cname", "java就業(yè)課程實(shí)戰(zhàn)"); // 對(duì)預(yù)處理參數(shù)賦值
query.setParameter("credit", 10); // 對(duì)預(yù)處理參數(shù)賦值
query.setParameter("start", DateUtil.stringToDate("2021-10-01")); // 對(duì)預(yù)處理參數(shù)賦值
query.setParameter("end", DateUtil.stringToDate("2022-10-01")); // 對(duì)預(yù)處理參數(shù)賦值
query.setParameter("num", 999); // 對(duì)預(yù)處理參數(shù)賦值
query.executeUpdate(); // 執(zhí)行最終sql
entityManager.getTransaction().commit();// 提交事務(wù)
}執(zhí)行結(jié)果:

到此這篇關(guān)于JPA原生SQL實(shí)現(xiàn)增刪改查的示例詳解的文章就介紹到這了,更多相關(guān)JPA SQL增刪改查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java對(duì)稱(chēng)加密算法DES實(shí)例詳解
這篇文章主要介紹了Java對(duì)稱(chēng)加密算法DES,結(jié)合實(shí)例形式詳細(xì)分析了java DES算法的概念、原理、實(shí)現(xiàn)方法與應(yīng)用場(chǎng)景,需要的朋友可以參考下2019-09-09
MyBatis的CRUD中的不同參數(shù)綁定查詢(xún)實(shí)現(xiàn)
本文主要介紹了MyBatis的CRUD中的不同參數(shù)綁定查詢(xún)實(shí)現(xiàn),主要包括單個(gè)參數(shù)傳遞綁定,序號(hào)參數(shù)傳遞綁定,注解參數(shù)傳遞綁定,pojo(對(duì)象)參數(shù)傳遞綁定,map參數(shù)傳遞綁定這幾種類(lèi)型,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
Spring Shell應(yīng)用程序開(kāi)發(fā)流程解析
這篇文章主要介紹了Spring Shell應(yīng)用程序開(kāi)發(fā)流程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

