a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 171|回复: 1

[基础知识] JAVA基础:Hibernate数据查询(4)

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
以上两种方式编写的代码都使用相同的SQL语句来完成它们的功能,如下:   select  g.*, s.* from Group g. A2 G; f* `# N/ L
  left outer join Student s* \+ w' e' ]9 c; T
  on g.id = s.group_id4 S+ a* O* A( ^3 U1 @
  where g.name like '%2005'7 I" F: ~0 Q1 f- e) d# O
  Native SQL查询. U% C" Q) K  T3 M, a8 {
  本地SQL查询指的是直接使用本地数据库的SQL语言进行查询。这样做对于将 原来的SQL/JDBC程序迁移到Hibernate应用很有用
0 O2 [2 d4 @1 z# ?( c  创建一个基于SQL的Query
" u5 B! p0 T5 i' k  Native SQL查询是通过SQLQuery接口来控制的,它通过调用Session.createSQLQuery()方法来获得。如:
  _$ [" F4 C' j$ \; [  String sql = "select {s.*} from t_student s where s.age>22";2 r% o8 U) u; F/ k
  //{}用来引用数据表的别名,{s.*}表示使用s来做为t_student表的别名
& R  P; O3 ]+ e# |6 R( h1 r  SQLQuery sqlQuery = session.createSQLQuery(sql);
9 x6 g# z% ?2 L% [' q% ~# R: ]  sqlQuery.addEntity("s",Student.class);5 K* |: g; y" O- R  K$ G. ]& T  ]
  List list = sqlQuery.list();) h, S4 L! q1 o: @2 g- p: }
  for(int i = 0 ; i < list.size(); i++)
; H: I0 Q; [" w$ u) o( ]  {
  j7 M5 i+ G. A& Q$ r/ L& }  Student stu = (Student)list.get(i);
- d+ a( G: T( N+ }0 y  }4 t& A" v9 ^7 A, a2 x+ p$ T+ ]! w  J
  //createSQLQuery(String sql)利用传入的sql参数构造一个SQLQuery实例。使用该方法时,还需要传入查询的实体类,因此在配合使用SQLQuery的addEntity()方法一起使用。# U2 {7 X' q6 e$ y
  命名SQL查询
# m7 ]) ~6 g" y2 h2 k. t  与HQL的命名查询相似,也可以将 本地的SQK查询语句定义在映射文件中,然后像调用一个命名HQL查询一样专题报道调用命名SQL查询。
: Q2 P: S; m' @/ a8 u  如:   2 g( f: r& g* c! k
  
5 p+ P7 X) P$ `- j$ |! G7 `4 d7 J. i) T
    select {s.*} from t_student s where s.age > 22
9 Z( S% X, {, X/ @. e- e2 l+ m  ]]>  R8 @% [0 O$ N# d
  $ a$ U( @% A( y- w( i5 l- E1 S  H
    d* G7 o$ W. @6 K- _; _0 u% M+ X
  配合以上配置我们可以如下编写代码来查询 Query query = session.getNamedQuery("QueryStudents");8 z" I" M  S- m, e9 j5 _; c6 Q% r# g0 z
  List list = query.list();+ I) }% t1 X# \, |
  for(int i = 0 ; i < list.size();i++)& E' h3 D+ H' c# C. b
  {
8 ^9 e5 a% C! @" t7 j  Student stu = (Student)list.get(i);
4 g+ s  [/ H6 S2 n3 m4 V  }; k8 H# P% S) S; V8 y0 n
  也可以在命名查询是设定参数,如下:  
, q& i, K0 z$ U) ^' v
2 q" U6 C  d8 u    select {s.*} from t_student s where s.age > :age$ g/ B! [; e/ e8 u' M3 @
  ]]>
- K8 b3 g4 e( m& B  
- a' W- H- e0 U! O0 M7 Y4 V' U
5 w4 @. t! }% p4 s  
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA基础:Hibernate数据查询(4)

</p>  程序代码: Query query = session.getNamedQuery("QueryStudents");
4 U: k2 b% f# W' A1 Z: |4 R# s  query.setInteger("age",22);" s, k% X! |" b# \% R5 H8 u
  List list = query.list();3 e6 O2 C* u% X+ A& I
  for(int i = 0 ; i < list.size();i++)
; V/ |' S% N0 y' O+ K  {
- C7 S: K1 Y5 l* j5 r# g+ |0 J  Student stu = (Student)list.get(i);& Y& d# U6 r: C- S4 K/ b
  }自定义insert , update和delete语句:1 w, b- C- t3 k$ J# F  z& z
  Hibernate 3.x的映射文件中新添加,,3个标记。可以使用这3个标记自定义自己的insert ,update,delete语句,如:
8 F8 I8 m1 N& S; x0 ^: l  0 E. E% C$ j- [' _* D
  insert into t_student(name,age,id) values(?,?,?)6 a2 B8 Z: e9 [8 d1 [
  
+ U( O5 l  a7 v# y9 V  
. q8 M( P' `# K5 ~3 J* j1 d' l  update t_student set name=?,age=? where id=?5 Z0 ]; B0 p' q8 R( P6 n3 _
  
7 j  z$ G# S# N& d$ g  1 E; N  Z* m! s6 x0 |0 I
  delete from t_student where id = ?, k7 e& f# V7 i8 T
  ' _& j! K& G1 g% n/ L4 @. {* e
  对于以上自定义的SQL语句,要注意以下几点3 ^* U" C- R% Q  G; ]- c7 l
  1:insert 和update语句中定义的字段必须和映射文件声明的属性相应,一个都不能少。
& [3 i3 t* g) u, B6 g! [$ {& W  2:在insert 和update语句中,属性出现的顺序必须和映射文件中的顺序一样。( Z2 q/ ?9 `1 d- v! G- N
  3:在insert语句中,主键id总是放在最后。
  G) i0 l) \# G; _" {( o# K; }6 U  在程序中实现以上自定义的insert语句如下: Student stu = new Student();
: G/ |2 B+ Q$ E9 n; w6 ?5 {. N+ u  stu.setName("Bill");1 z) ]+ c; F! I  A" V
  stu.setAge(22);
4 b8 f# t7 F: _# J. J5 B9 C+ T  session.save(stu);如果不想在insert或update语句中包括所有属性,则可以在属性定义时 加上insert ="false"或update="false"如下:
) C. l  b& R0 E4 t! \* K  
  m! Q: W" {, }  insert into t_student(age,id) values(?,?)
# ~7 F3 W. i; I1 E  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-6 12:28 , Processed in 0.321976 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表