※基本使用
@NamedNativeQueries({
@NamedNativeQuery(
name = "ooo",
query = "SELECT * FROM EMP WHERE SAL >= :sal",
resultClass = Emp.class
)
})
Query q1 = s.getNamedQuery("ooo");
q1.setInteger("sal", 3000);
@SuppressWarnings("unchecked")
List<Emp> list = q1.list();
for (Emp e : list) {
System.out.println(e.getDept().getDname());
}
※@寫在class最上面,看要寫在Emp還Dept都抓的到,和@Entity、@Table同樣的地方
※@NamedNativeQueries是個陣列,但如果只有一個陣列可以不寫,所以以這個例子,只要@NamedNativeQuery就可以了
※scalar
@NamedNativeQuery(
name = "ooo",
query = "SELECT * FROM EMP WHERE SAL >= :sal",
resultSetMapping = "aaa"
)
@SqlResultSetMapping(
name = "aaa",
columns = {
@ColumnResult(name = "job"),
@ColumnResult(name = "sal")
}
)
Query q = s.getNamedQuery("ooo");
q.setInteger("sal", 3000);
@SuppressWarnings("unchecked")
List<Object[]> list = q.list();
for (Object[] oA : list) {
for (Object o : oA) {
System.out.println(o);
}
System.out.println();
}
※一樣有scalar的功能,如上的例子,雖然是*號,但也只能使用job和sal而已
※resultSetMapping的名字要一樣
※addEntity
@NamedNativeQuery( name = "ooo", query = "SELECT * FROM EMP WHERE SAL >= :sal", resultSetMapping = "aaa" ) @SqlResultSetMapping( name = "aaa", entities = @EntityResult(entityClass = Emp.class) )
Query q1 = s.getNamedQuery("ooo");
q1.setInteger("sal", 3000);
@SuppressWarnings("unchecked")
List<Emp> list = q1.list();
for (Emp e : list) {
System.out.println(e.getDept().getLoc());
}
※和之前一樣,一定要*號或全打,不然會出「java.sql.SQLException: 資料欄名稱無效」的錯
※欄位對應
如果資料庫的欄位和Java類名稱不同,可以這樣對應@NamedNativeQueries({
@NamedNativeQuery(
name = "ooo",
query = "SELECT * FROM EMP WHERE SAL >= :sal",
resultSetMapping = "aaa"
)
})
@SqlResultSetMapping(
name = "aaa",
entities =
@EntityResult(
entityClass = Emp.class,
fields = {
@FieldResult(name = "empno", column = "EMPNO"),
@FieldResult(name = "ename", column = "ENAME"),
@FieldResult(name = "job", column = "JOB"),
@FieldResult(name = "mgr", column = "MGR"),
@FieldResult(name = "hiredate", column = "HIREDATE"),
@FieldResult(name = "sal", column = "SAL"),
@FieldResult(name = "comm", column = "COMM"),
@FieldResult(name = "dept", column = "DEPTNO")
}
)
)
Query q1 = s.getNamedQuery("ooo");
q1.setInteger("sal", 3000);
@SuppressWarnings("unchecked")
List<Emp> list = q1.list();
for (Emp e : list) {
System.out.println(e.getDept().getLoc());
}
※@FieldResult的name和column為必填
※JOIN多張表
多張表也可以對應@NamedNativeQuery(
name = "ooo",
query = "SELECT * FROM EMP e, DEPT d WHERE e.DEPTNO = d.DEPTNO",
resultSetMapping = "aaa"
)
@SqlResultSetMapping(name = "aaa",
entities = {
@EntityResult(
entityClass = Emp.class,
fields = {
@FieldResult(name = "empno", column = "EMPNO"),
@FieldResult(name = "ename", column = "ENAME"),
@FieldResult(name = "job", column = "JOB"),
@FieldResult(name = "mgr", column = "MGR"),
@FieldResult(name = "hiredate", column = "HIREDATE"),
@FieldResult(name = "sal", column = "SAL"),
@FieldResult(name = "comm", column = "COMM"),
@FieldResult(name = "dept", column = "DEPTNO")
}
),
@EntityResult(
entityClass = Dept.class,
fields = {
@FieldResult(name = "deptno", column = "DEPTNO"),
@FieldResult(name = "dname", column = "DNAME"),
@FieldResult(name = "loc", column = "LOC")
}
)
}
)
Query q1 = s.getNamedQuery("ooo");
@SuppressWarnings("unchecked")
List<Object[]> list = q1.list();
for (Object[] oA : list) {
for (Object o : oA) {
if (o instanceof Emp) {
Emp e = (Emp) o;
System.out.println(e.getEname());
} else if (o instanceof Dept) {
Dept d = (Dept) o;
System.out.println(d.getDname());
}
}
System.out.println();
}
※無對應的欄位
如果有自定的欄位,如ename+dname合成一個新的欄位時,可以這樣用@NamedNativeQuery(
name = "ooo",
query = "SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, e.DEPTNO, d.DNAME, d.LOC, e.ENAME || '-' || d.DNAME as EDNAME, SAL * 2 SAL2 FROM EMP e, DEPT d WHERE e.DEPTNO = d.DEPTNO",
resultSetMapping = "aaa"
)
@SqlResultSetMapping(name = "aaa",
entities = {
@EntityResult(
entityClass = Emp.class,
fields = {
@FieldResult(name = "empno", column = "EMPNO"),
@FieldResult(name = "ename", column = "ENAME"),
@FieldResult(name = "job", column = "JOB"),
@FieldResult(name = "mgr", column = "MGR"),
@FieldResult(name = "hiredate", column = "HIREDATE"),
@FieldResult(name = "sal", column = "SAL"),
@FieldResult(name = "comm", column = "COMM"),
@FieldResult(name = "dept", column = "DEPTNO")
}
),
@EntityResult(
entityClass = Dept.class,
fields = {
@FieldResult(name = "deptno", column = "DEPTNO"),
@FieldResult(name = "dname", column = "DNAME"),
@FieldResult(name = "loc", column = "LOC")
}
)
}
,columns = {
@ColumnResult(name = "EDNAME"),
@ColumnResult(name = "SAL2")
}
)
Query q1 = s.getNamedQuery("ooo");
@SuppressWarnings("unchecked")
List<Object[]> list = q1.list();
for (Object[] oA : list) {
for (Object o : oA) {
if (!(o instanceof Emp) && !(o instanceof Dept)) {
System.out.println(o);
}
}
System.out.println();
}
※和Join多張表比起來,最主要就是columns
※一樣因為addEnity的問題,所以要全打,但join的欄位,只要取其一即可,以這個例子就是deptno,當然要全打也OK
沒有留言:
張貼留言