這篇文章主要記錄 使用原生sql查詢 並且把查詢結果轉為實體對象, 注意:這兒使用的數據庫 是oracle數據庫
這兒記錄了三種查詢:精確查詢,模糊查詢,分頁查詢。
1.把原生sql查詢的結果轉為實體類對象用的是 Query query = em.createNativeQuery(sql, Student.class);
2.實體類 要使用@Entity 和 @Id 注解,否則會報錯
新建實體類
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Student {
@Id
private Long classNo;
private Long studentNo;
private String remark;
//省略了getter setter方法
@Override
public String toString() {
return "RiskUnit [classNo=" + classNo + ", studentNo=" + studentNo + ", remark=" + remark + "]";
}
}
1. 精確查詢 where t.riskunit_id = :riskunit_id
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
public class JpaDemoTest {
@PersistenceContext
private EntityManager em;
public void testJpaNativeQuery() {
// sql
String sql = "select t.class_no classNo ,t.student_no studentNo ,t.remark remark from t_student t where t.class_no = :class_no ";
// 執行查詢 並把結果專為實體類
Query query = em.createNativeQuery(sql, Student.class);
// 參數值
query.setParameter("class_no", 400002);
// 獲取查詢結果
List<Student> students = query.getResultList();
System.out.println("students===" + students.toString());
}
}
2. 模糊查詢 where t.riskunit_id like '%'||:riskunit_id||'%'
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
public class JpaDemoTest {
@PersistenceContext
private EntityManager em;
public void testJpaNativeQuery() {
// sql
String sql = "select t.class_no classNo ,t.student_no studentNo ,t.remark remark from t_student t where t.class_no like '%'||:class_no||'%' ";
// 執行查詢 並把結果專為實體類
Query query = em.createNativeQuery(sql, Student.class);
// 參數值
query.setParameter("class_no", 400002);
// 獲取查詢結果
List<Student> students = query.getResultList();
System.out.println("students===" + students.toString());
}
}
3. 原生sql查詢並分頁 這里參考oracle sql 3.oracle sql 分頁實現
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
public class JpaDemoTest {
@PersistenceContext
private EntityManager em;
public void testJpaNativeQuery() {
Integer pageNo = 2;
Integer pageSize = 10;
String sql = "select t.class_no classNo ,t.student_no studentNo ,t.remark remark from t_student t where t.class_no like '%' || :class_no || '%' order by t.class_no ";
sql = " select * from ( select a.*, rownum as a_rownum from (" + sql + ") a where rownum <= "
+ (pageNo + 1) * pageSize + ") b where b.a_rownum > " + pageNo * pageSize;
Query query = em.createNativeQuery(sql, Student.class);
query.setParameter("class_no", 40000);
List<Student> students = query.getResultList();
System.out.println("student===" + students.toString());
}
}
4. 有幾種可能hibernate或者sql的報錯:
1.Caused by: java.sql.SQLSyntaxErrorException: ORA-01747: invalid user.table.column, table.column, or column specification
查詢sql的字段名與數據庫關鍵字沖突了,仔細查看sql 是因為where t.like 寫錯了
2.javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown entity: com.mx.JpaDemo.entity.RiskUnit
需要在實體類RiskUnit上加上@Entity注解
3.Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.mx.JpaDemo.entity.RiskUnit
需要在實體類加上@Id注解