什么是命名查询? Hibernate允许在映射文件中定义字符串形式的查询语句,这种查询方式成为命名查询
使用命名查询有什么好处? 由于使用Hibernate的HQL常常需要在Java代码中写字符串查询语句,HQL混杂在代码之间,破坏代码可读性,通过使用命名查询,可以使业务逻辑和查询语句分离,使您专注于查询,而避免了 SQL 或者 HQL 代码分散于整个应用程序中的情况。
可以应用命名查询做复杂查询的处理
命名查询如何实现? 介绍下面几种方式:
方法一:在配置文件中<class/>标记的下面,声明查询语句
复制代码 代码如下:
<hibernate-mapping>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="name" length="11" />
</property>
<property name="age" type="integer">
<column name="age" />
</property>
<property name="sex" type="string">
<column name="sex" length="2" />
</property>
</class>
<!-- 定义查询语句 -->
<query name="findStudentByName">
<![CDATA[from Student where name = :name]]>
</query>
</hibernate-mapping>
备注:<![CDATA[ ]]>是什么意思?
标明是纯文本的,没有这个的话 < > & 字符是不能直接存入XML的,需要转义,而用这个标记则不需要转义而将这些符号存入XML文档。可以避免未预料的特殊符号导致XML解析出错。
复制代码 代码如下:
public List<Student> query(){
Session session = HibernateSessionFactory.getSession();
Query q = session.getNamedQuery("findStudentByName");
q.setString("name", "zhangsan");
List<Student> list = q.list();
return list;
}
方法二:也可以在配置文件中<class/>标记的里面,声明查询语句, 但是java代码调用时需要指定(包+类+配置名)
复制代码 代码如下:
<hibernate-mapping>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="name" length="11" />
</property>
<property name="age" type="integer">
<column name="age" />
</property>
<property name="sex" type="string">
<column name="sex" length="2" />
</property>
<!-- 定义查询语句 -->
<query name="findStudentByName">
<![CDATA[from Student where name = :name]]>
</query>
</class>
</hibernate-mapping>
public List<Student> query(){
Session session = HibernateSessionFactory.getSession();
Query q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
q.setString("name", "zhangsan");
List<Student> list = q.list();
return list;
}
方法三:使用原生sql查询<sql-query>,使用此种方式必须把表所有的列写全才可以,否则会出现‘列名无效'的错误 ,除非你使用return-scalar来设置字段类型。
复制代码 代码如下:
<hibernate-mapping>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="name" length="11" />
</property>
<property name="age" type="integer">
<column name="age" />
</property>
<property name="sex" type="string">
<column name="sex" length="2" />
</property>
</class>
<!-- 定义查询语句 -->
<sql-query name="findStudentByName">
<return alias="s" class="com.test.bean.Student">
</return>
<![CDATA[select {s.*} from student s where s.name = :name]]>
</sql-query>
</hibernate-mapping>
备注:也可以在<return/>标记里面应用<return-property/>标记将表的所有字段列出来,与上面描述的方法一样,都是查询出来所有列。
复制代码 代码如下:
public List<Student> query(){
Session session = HibernateSessionFactory.getSession();
Query q = session.getNamedQuery("findStudentByName");
q.setString("name", "zhangsan");
List<Student> list = q.list();
return list;
}
方法四:使用原生sql查询<sql-query>, 如果应用return-scalar来设置字段类型, 就可以实现查询部分字段。
复制代码 代码如下:
<hibernate-mapping>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id" type="integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="name" length="11" />
</property>
<property name="age" type="integer">
<column name="age" />
</property>
<property name="sex" type="string">
<column name="sex" length="2" />
</property>
</class>
<!-- 定义查询语句 -->
<sql-query name="findStudentByName">
<return-scalar column="name" type="string"/>
<return-scalar column="age" type="integer"/>
<![CDATA[select s.name , s.age from student s where s.name = :name]]>
</sql-query>
</hibernate-mapping>
public List<Object[]> query(){
Session session = HibernateSessionFactory.getSession();
Query query = session.getNamedQuery("findStudentByName");
query.setString("name", "zhangsan");
List<Object[]> list = query.list();
return list;
}
或者:
复制代码 代码如下:
public List<Student> query(){
Session session = HibernateSessionFactory.getSession();
Query q = session.getNamedQuery("findStudentByName").
setResultTransformer(Transformers.aliasToBean(Student.class));
q.setString("name", "zhangsan");
List<Student> list = q.list();
return list;
}
相关推荐:
一秒采集:提升效率、创造价值的秘密武器,苏州网站整站优化
优化入口:提升网站流量与转化率的秘密武器,琼海关键词排名品牌
SEO项目:如何通过精确优化提升企业网站排名与转化率,武汉做网站优化的公司
为什么seo吸引人,为什么seo吸引人呢 ,ai路径查找器绘制树
企业如何借助SEO咨询实现精准流量引爆,助力业绩提升,立刻推广的旅游线下营销
SEO排位:如何通过精准策略提升网站排名,获得流量与转化,林海网络推广营销
seo进阶买什么书运营,seo入门难吗 ,没有ai软件怎么打开ai图片
《“查看更多”背后的秘密:让你的人生更加丰富多彩!》,宁安公司网站建设
为什么网站要做seo,网站做seo的目的是什么 ,ai初选
ChatGPT崩了?用户称打开是一片空白,背后隐藏了什么?,ai 新技巧
ChatGPT目前,我无法查看或打开附件,但我依然能为你提供全面的帮助,苹果ai谷歌ai
在线AI文章生成器开启智能创作新时代
ChatGPT崩溃!用户反馈网页端无法访问,修复急需,ai院子
SEO就是:让你的品牌脱颖而出,获得更多曝光与流量,梅岭关键词排名优化
AI仿写文章:开启内容创作新纪元
SEO代做:让你的企业轻松登顶搜索引擎,快速提升曝光率,seo 提高注册量
SEO提供:如何通过精准的SEO策略提升网站流量与品牌影响力,刷关键词排名立的火星
seo软文有什么作用,seo文案是什么 ,斐乐Ai测评问题
ChatGPT:我目前无法查看或解析附件,您是否遇到过这样的困扰?,ai+燃烧
360AI写作怎样?助力创作的新风尚,ai到访
AI人工智能生成文章:开启写作新时代
未来工作方式!AI在线工具让效率倍增,工作变轻松
AI写作技巧,让创作事半功倍!
亚马逊站内seo是什么优化,亚马逊seo关键词优化软件 ,ai画卡通章鱼
GPT人工智能-让未来触手可及的智慧之光,ai头花写真
ChatGPT无法加载?检查您的网络设置并尝试重启,轻松解决连接问题!,ai制作艺术字
“扩写AI”-引领写作革命,开启智能创作新时代,dede seo 标题如何填写
SEO精通:让你的内容在搜索引擎中脱颖而出,跨境电商 推广营销
360刷排名工具选哪家?揭秘2025年最强排名优化工具!,ai写作网站哪个好一点
ChatGPT为什么网址打不开?原因分析与解决方法,文档审核ai
seo词库优化,搜索词条优化 ,ai点选择
ChatGPT4网页空白:重新定义智能交互的未来,怎么登ai
SEO手法如何通过精准优化提升网站排名,获取海量流量,网站建设协议流程是什么
ChatGPT3.5需要登录使用吗?AI使用的真相!,电脑版写作ai推荐怎么关闭
SEO优化基础:让你的网站脱颖而出的秘密武器,模仿猫ai
SEO优化排名原理解析:如何提高网站排名,实现精准流量获取,奥迪ai售价
ChatGPT启动时遇到问题?快速解决方案让你畅享智能对话体验,ai如何保存logo
seo要学会什么,seo要学多长时间 ,NTU AI 录取
AI一键生成文章在线:提升创作效率,改变写作方式
SEO外链建设:提升网站排名的关键策略,ai偏执
用AI写一篇文章,如何提升你的写作效率与创意
SEO联系:如何通过SEO优化提升您的网络营销效果,企业营销推广获客
SEO非常:如何利用SEO提升网站排名与流量,助力品牌快速成长,绥化短视频营销推广
AI撰写大数据解决方案:开启智能数据时代的新篇章,ai头号公敌
seo灰帽是什么,灰帽是指什么 ,ai绘画六边形
SEO有意:如何通过优化策略提升网站排名与流量,天津政府智慧网站建设
WPS改写-轻松提升文档创作效率的秘密武器,推广网站的优势
ChatGPT维护-智能时代的数字助手,如何让你的工作更高效,ai智能救援
SEO调整,助力网站流量爆发式增长!,江都seo优化排名
ChatGPT服务器坏了?了解背后的技术与应对策略,AI模块代表