Java持久性API(JPA)第3讲——使用查询

目标:掌握Query接口的使用
主要内容包括:
u 查询所有信息
u 使用Query完成分页
u 根据条件查询
u 相关接口方法介绍
1、查询所有信息
在第一讲中查询所有信息的代码如下:
List<Userinfo> list = em.createQuery("select u from Userinfo u").getResultList();
相当于下面的两行代码:
Query q = em.createQuery("select u from Userinfo u");
List<Userinfo> list =q.getResultList();
查询语句“select u from Userinfo u”不是标准的SQL语句,其中Userinfo是实体类的名字,u相当于对象。查询的结果是封装后的对象。这与以前的JDBC是不同的,SQL语句查询的结果是ResultSet。如果查询结果是多个,应该使用Query接口的getResultList方法,如果查询结果只有一个,可以使用Query接口的getSingleResult方法。
这种方式的查询直接在参数中写查询语句,还可以把查询语句单独写出来,然后调用。这种方式称为命名查询,例如使用命名查询上面的语句可以写成下面的样子:
@NamedQuery(name = "findAllUser", query = "SELECT u FROM Userinfo u")
name表示该查询的名字,query是查询语句本身。命名查询可以写在实体类中,第一次课生成的实体类中就有多个命名查询。
对于命名查询可以使用EntityManager的createNamedQuery方法,要访问上面的查询可以使用下面的代码:
Query q = em.createNamedQuery("findAllUser");
List<Userinfo> list =q.getResultList();
createNamedQuery方法的参数命名查询的名字。
实验:把第一次课中的查询修改成命名查询。
参考过程:
1)修改Userinfo实体类中的如下代码(红色部分是新添加的):
@NamedQueries( {
@NamedQuery(name = "Userinfo.findByUserid",
query = "SELECT u FROM Userinfo u WHERE u.userid = :userid"),
@NamedQuery(name = "Userinfo.findByUsername",
query = "SELECT u FROM Userinfo u WHERE u.username = :username"),
@NamedQuery(name = "Userinfo.findByUserpass",
query = "SELECT u FROM Userinfo u WHERE u.userpass = :userpass"),
@NamedQuery(name = "Userinfo.findByUsertype",
query = "SELECT u FROM Userinfo u WHERE u.usertype = :usertype"),
@NamedQuery(name = "findAllUser", query = "SELECT u FROM Userinfo u")
})
2)修改UserManagerBean中的findAllUser方法,修改后的代码如下:
public List<Userinfo> findAllUser(){
// return em.createQuery("select u from Userinfo u").getResultList();
Query q = em.createNamedQuery("findAllUser");
List<Userinfo> list =q.getResultList();
return list;
}
3)从新部署、测试。
2、使用Query完成分页
分页显示就是每次只显示部分对象的信息。要显示哪一部分信息取决于从什么地方开始显示,显示到什么地方。Query接口可以控制要获取的记录,有两个方法来设置要获取的第一条记录和最后一条记录。两个方法的定义分别如下:
setMaxResults(int maxResult),参数是要查询的最大记录数。
setFirstResult(int startposition),参数是第一个要查询的记录的位置。
通过这两个属性完成分页显示。
实验:自己完成用户信息列表的分页显示,每页显示5条记录。
提示:在会话Bean中添加一个根据页码查询的方法,参数是要显示的页码。
3、根据条件查询
根据条件查询包括查询语句的构造和查询条件处理。
3.1 构造查询语句
根据条件查询,需要在查询语句中使用变量,可以有两种方式:位置参数和名字参数。
位置参数
在位置参数中,使用“?”号加上参数的序号的方式表示参数。
例,根据用户名username查询用户。
SELECT u FROM Userinfo u where u.username = ?1
1表示第一个参数。
在位置参数中,可以使用多个参数,可以用不同的数字表示。同一个参数可以在查询中出现多次。
名字参数
在名字参数种,使用“:”号加上参数的名字的方式表示参数。
例,根据用户类型查询用户。
SELECT u FROM Userinfo u WHERE u.usertype = :usertype
“:”号后面的usertype就是参数的名字。
不管是位置参数还是名字参数都可以在命名查询中使用。
3.2 处理查询条件
在执行查询语句的时候需要为条件赋值,可以通过Query接口的相应方法完成。位置参数和名字参数使用的赋值方法是不同的,并且参数可以是各种类型。用于位置参数的主要方法如下:
public Query setParameter(int position,Object value)
public Query setParameter(int position,Date value,TemporalType temporalType)
public Query setParameter(int position,Calendar value,TemporalType temporalType)
用于名字参数的赋值方法基本相同,只是第一个参数用于指定参数的名字。主要方法如下:
public Query setParameter(String name,Object value)
public Query setParameter(String name,Date value,TemporalType temporalType)
public Query setParameter(String name,Calendar value,TemporalType temporalType)
例1:使用前面介绍的根据用户名进行查询的语句。
Query q = em.createQuery("SELECT u FROM Userinfo u where u.username = ?1");
q = q.setParameter(1,username);
List<Userinfo> list =q.getResultList();
例2:使用前面介绍的根据用户类型进行查询的语句。
Query q = em.createQuery("SELECT u FROM Userinfo u WHERE u.usertype = :usertype");
q = q.setParameter("usertype",usertype);
List<Userinfo> list =q.getResultList();
实验:在前面的功能中添加根据用户名和用户类型进行查询的功能。
参考实验过程及代码。
1)在UserManagerBean中添加根据用户名和根据用户类型查询用户的方法,方法如下:
// 根据用户名查询
public List<Userinfo> findUserByName(String username){
// 使用位置参数
Query q = em.createQuery("SELECT u FROM Userinfo u where u.username = ?1");
// 为参数赋值
q = q.setParameter(1,username);
// 得到查询结果
List<Userinfo> list =q.getResultList();
// 返回查询结果
return list;
}
// 根据用户类型查询
public List<Userinfo> findUserByType(char usertype){
// 使用命名参数
Query q = em.createQuery("SELECT u FROM Userinfo u WHERE u.usertype = :usertype");
// 为参数赋值
q = q.setParameter("usertype",usertype);
// 得到查询结果
List<Userinfo> list =q.getResultList();
// 返回查询结果
return list;
}
2)在UserManagerRemote中声明上面的两个方法,参考代码如下:
public List<Userinfo> findUserByName(String username);
public List<Userinfo> findUserByType(char usertype);
3)修改FindAllUserServlet,让该控制器可以完成3种查询的控制,参考代码(红色部分为核心代码)如下:
/*
* FindAllUserServlet.java
*
* Created on 2007年5月21日, 上午6:27
*/
package jpa.web;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.ejb.EJB;
import jpa.UserManagerRemote;
import jpa.Userinfo;
import java.util.List;
import java.util.Iterator;
/**
*
* @author Administrator
* @version
*/
public class FindAllUserServlet extends HttpServlet {
@EJB
UserManagerRemote user;
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String usertype = request.getParameter("usertype");
// 调用业务方法
List<Userinfo> list;
// 根据参数确定查询类型,调用相应的方法
if(username != null)
list = user.findUserByName(username);
else if(usertype != null)
list = user.findUserByType(usertype.charAt(0));
else
list = user.findAllUser();
// 把查询的结果存储到request中,从而传递到页面
request.setAttribute("userlist",list);
// 专向userlist.jsp
RequestDispatcher rd = request.getRequestDispatcher("userlist.jsp");
rd.forward(request,response);
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
4)添加一个输入查询条件和显示查询结果的JSP文件userlist.jsp,参考代码如下:
<%@page contentType="text/html"%>
<%@page pageEncoding="gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户信息</title>
</head>
<body>
<h1>用户信息</h1>
<br>
<form action="FindAllUserServlet" method="POST">
根据用户名查询:<input type="text" name="username"/>
<input type="submit" value="确定" />
</form>
<br>
<form action="FindAllUserServlet" method="POST">
根据类型查询:<select name="usertype">
<option value="0" selected>普通用户</option>
<option value="1">管理员</option>
</select><input type="submit" value="确定" />
</form>
<br>
<form action="FindAllUserServlet" method="POST">
<input type="submit" value="显示所有" />
</form>
<table border="1">
<thead>
<tr>
<th>序号</th>
<th>用户ID</th>
<th>用户名</th>
<th>权限</th>
</tr>
</thead>
<tbody>
<c:forEach varStatus="status" var="user" items="${userlist}">
<tr>
<td>${status.index+1}</td>
<td>${user.userid}</td>
<td>${user.username}</td>
<td>
<c:if test="${user.usertype==\"0\"}">
普通用户
</c:if>
<c:if test="${user.usertype==\"1\"}">
管理员
</c:if>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
5)部署、测试。
思考:如何在显示查询结果的时候把查询条件也显示出来?
4、相关接口方法
关于Query接口的方法参考书上370页Query接口部分。关于EntityManager接口的方法参考书上358页EntityManager接口部分。
【NVIDIA】Jetson Orin Nano系列:编译外部驱动(交叉编译和板上编译) Orin Nano外部驱动的开发入门,以hello world为例。使用交叉编译和板上编译两种方法 阅读详情

相关推荐

【CQUT】从零开始龙芯杯-开始前的准备

不同级别的Cpu对于vivado综合的时间有较大影响,其中Cpu的单核、多核性能以及cache性能影响权重较高。因此,为了保证学习进度和效率,我们建议在Cpu不低于I5 12400的环境下进行学习。Vivado2023.2安装包约100GB,为了保证成功安装建议留出300GB硬盘空间。龙芯杯的许多资料被托管在gitee,你需要git指令将资料克隆到本地。指定用书:CPU设计实战 Loongarch版 作者:汪文祥、邢金璋。Cpu性能对比网站:https://www.cpu114.com/

weixin_73689971的博客 911

Abp 数据过滤获取AbpUser表数据

使用zero模块的时候,一直获取不到Abpuser中的其他数据,经问群里,是取消数据过滤,代码如下  ///禁用数据过滤            using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant, AbpDataFilters.MustHaveTenant))            {          

wang4978的专栏 4440

将pytorch的权值矩阵量化为定点数补码并导入FPGA中

Xilinx FPGA实现LSTM算法时对ROM的初始化 将pytorch框架的权重矩阵以定点数补码的形式导入到FPGA中 文章目录Xilinx FPGA实现LSTM算法时对ROM的初始化1. pytorch框架中的LSTM2. 初始化一个RNN模型 3. 初始化ROM的coe文件格式 4. 将参数转换为补码,并且输出到coe文件 5. 配置一个ROM 6. 结论7. 代码 1. pytorch框架中的LSTM pytorch框架将LSTM算法中的八个权值矩阵连接成两个矩阵,假设要导入的LSTM网络的输

随缘分享 4528

python正则表达式re模块之findall函数

它返回string中所有与pattern匹配的全部字符串,返回形式为列表,如果pattern中含有分组,返回分组的匹配结果。如果有pattern中有多个分组,则返回元组列表。importrekk=re.compile(r'\d+')kk.findall('one1two2three3four4')#[1,2,3,4]#注意此处findall()的用法,可传两个参数;......

Lavi的专栏 1万+

MIPI CSI-2数据加扰技术解析:LFSR实现与多通道同步策略

本文深入解析了MIPI CSI-2协议中的数据加扰技术,该技术通过线性反馈移位寄存器(LFSR)对图像数据进行随机化处理,旨在有效降低高速传输中的电磁干扰。文章详细阐述了LFSR的工作原理、D-PHY与C-PHY物理层不同的初始化与同步策略,并探讨了多通道同步的实现方法,为高速接口的EMC设计与调试提供了实践指导。

weixin_29207149的博客 386

低供电电压CMOS偏置电路分析(有些类似于三支路电流源)

1、偏置电路原理图以及仿真结果 电路电流分析:Ip=Ip1=Ip2=Ip3,那么 Ip=12μnCoxWL(IpR−VTH)2 I_p=\frac{1}{2} μ_nC_{ox}\frac{W}{L} (I_{p}R-V_{TH})^2 Ip​=21​μn​Cox​LW​(Ip​R−VTH​)2 解出方程式即可得到参考电流及参考电压 2、电路电源抑制比PSRR分析 这里为了方便,小信号前都不加△ 首先做一个近似,由于gmRo>>1,直接将VDD变化导致的P3管漏级电压变化与VDD变化量做相等

qq_46579389的博客 2910

正则表达式入门-findall()函数

正则表达式入门-findall()函数 findall()函数 例子 import re a = '123abc' re=re.findall('\d\d\d',a) print(re) 导入用于完成正则表达式操作的re库 使用re库中的findall()函数提取文本 '\d'表示匹配1个数字,那么'\d\d\d'就表示匹配连续的3个数字 语法为 re.findall(匹配规则,原始文档) 注意:findall()函数返回的是一个包含提取结果的列表 import re a = '456qwe789rt

小旺的博客 1万+

【WRF模拟】土地利用类型的确定:最大覆盖法/瓦片法

土地利用类型的确定:最大覆盖法/瓦片法

WW、forever的博客 1529

python进阶--正则表达式(2)

一、初识正则表达式 为了使计算机具有在文本中检索某种模式的能力,我们引入了正则表达式。 正则表达式为高级的文本模式匹配、抽取或者文本形式的搜素和替换功能提供了基础。利用正则表达式能够匹配多个字符串。 正则表达式的强大之处在于引入了特殊字符来定义字符集、匹配子组和重复模式。由于有了这些特殊符号,正则表达式可以匹配字符串集合,而不仅仅是某单个字符串。 二、特殊符号和字符 </tbody> </table>

u010671028的博客 765

某音私信接口二进制解析

本文探讨了某音私信接口的二进制请求处理过程,重点分析了请求体中的非文本字符和混合编码结构。文章详细描述了编码过程,包括使用Protocol Buffers的序列化方法将结构化数据转换为字节流,并通过Uint8Array包装成二进制数组。作者展示了如何提取和补全s.encode方法,并将其转化为Base64字符串以便在Python中解码执行

码王吴彦祖的博客 903

[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

分类(Classification)属于有监督学习(Supervised Learning)中的一类,它是数据挖掘、机器学习和数据科学中一个重要的研究领域。分类模型类似于人类学习的方式,通过对历史数据或训练集的学习得到一个目标函数,再用该目标函数预测新数据集的未知属性。本章主要讲述分类算法基础概念,并结合决策树、KNN、SVM分类算法案例分析各类数据集,从而让读者学会使用Python分类算法分析自己的数据集,研究自己领域的知识,从而创造价值。 19.1 分类 19.1.1 分类模型 与前面讲述的聚类模型类似

杨秀璋的专栏 2万+

使用EJB3 Java Persistence API标准化Java持久性

持久性对于大多数企业应用程序都非常关键,因为它们需要访问关系数据库(例如Oracle Database 10g)。如果您正在使用Java开发应用程序,您可能需要完成一些常规任务(例如数据库更新和检索),这是通过编写JDBC和SQL来完成的。最近几年,几种对象关系(O-R)映射框架(例如Oracle TopLink、JBoss Hibernate和BEA Kodo)开始流行,因为它们简化了持久性问题

yzhjisji的专栏 651

WinCC 7.5 读取 SQL server2016 中的表格数据

环境 win10 SQL Server 2016 WinCC V7.5 SP2 1 安装SQL Server 2016 2 选择服务器名称 .\WINCC 3 建数据库

skr? 7142

JPA的使用

Jpa 是一套ORM 的规范hibernate 不就是一个 ORM 框架也提供了对于 JPA 的实现:java 持久化 API。

拾玖的博客 1851

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java持久性API(The Java Persistence API)-一个简单的实体持久性编程模型

 Java持久性API(The Java Persistence API)-一个简单的实体持久性编程模型 原文连接:http://java.sun.com/developer/technicalArticles/J2EE/jpa/文章索引Java平台企业版(Java EE)第五版本最重要的主题是易于开发。贯穿整个平台的改变使开发企业Java应用程序变得更简单,需要少的多的代码。值得

龙行天下的专栏 1479

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java持久性API(JPA)第4讲——删除和修改.doc

 Java持久性API(JPA)——删除和修改目标:使用JPA完成删除和修改功能。主要内容包括:u       根据主键查询u       删除信息u       修改信息因为删除功能和修改功能都是对已有的实体进行操作,通常需要先得到实体,然后对实体进行操作,得到实体需要根据主键进行查询。所以在介绍删除和修改信息之前先介绍如何根据主键查询。1、根据主键查询在第3

李绪成的一亩三分地 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jpa jql 时间范围查询_什么是JPA?Java Persistence API简介

作为规范,Java Persistence API关注持久性,它将Java对象的创建过程和具体的创建形式解耦。并非所有Java对象都需要持久化,但大多数应用程序都会保留关键业务对象。JPA规范允许您定义应该保留哪些对象,以及如何在Java应用程序中保留这些对象。JPA本身不是一个工具或框架; 相反,它定义了一组可以由任何工具或框架实现的概念。虽然JPA的对象关系映射(ORM)模型最初基于Hiber...

weixin_39857480的博客 138

JPA-深度理解

Java应用程序传统上使用JDBC (Java数据库连接)等技术访问关系数据库,来持久存储数据。 由于面向对象技术和关系技术之间的差异,JDBC API要求开发人员手工编写SQL中最基本的CRUD(创建、读取、更新和删除)操作,而这些操作缺乏可移植性。 另外,代码完全依赖于SQL,当从一个数据库转换到另一个数据库时会更加困难。 因为关系技术关注的是数据及其关系,而面向对象不仅强调数据,而且还强调在数据上执行的操作。这导致了面向对象与面向关系不适配。 一个被广泛接受的解决方案是对象关系映射(ORM)。 J

海的那边,还是海吗 6903

使用WebSphere Application Server Community Edition开发JPA应用程序

JPA是用于管理持久性和对象/关系映射的Java API。 它可在Java EE 5环境和独立Java SE环境中使用。 它使用Java域模型提供对象/关系映射工具,以管理关系数据库。 它使用Java批注或XML文件配置来启用基于POJO的编程模型。 JPA提供了标准的映射定义(通过注释或XML)以及标准的运行时API和对象级查询语言(JPQL)。 JPA是EJB规范和Java EE 5平...

cuxiong8996的博客 2771

JPA (Java Persistence API)

JPA,是一套Sun公司Java官方制定的ORM规范。ORM,即对象关系映射(Object Relational Mapping),是一种程序技术,用于在关系数据库和业务实体对象之间做映射。ORM 框架的存在,让开发者可以更关注业务层面的编程,而不需要过多关注数据库层面的操作。其作用是在操作数据库之前,先把数据表与实体类关联起来,然后通过实体类的对象操作(增删改查)数据库表。二、JPA实现流程:2.1ORM 映射首先是 ORM 映射,通过注解或 XML 描述对象和表直接的映射关系。

weixin_50458070的博客 1321

jpa 查询 列表_终极JPA查询和技巧列表–第3部分

jpa 查询 列表 在阅读第三部分之前,请记住本系列的第一部分和第二部分 JPA:通过查询创建对象 JPA允许我们使用所需的值在查询内创建对象: package com.model; public class PersonDogAmountReport { private int dogAmount; private Person person; public PersonD...

最佳 Java 编程 508

Spring Boot中Jpa使用(简要)介绍

Java持久性API(JPA)是Java的一个规范。 它用于在Java对象和关系数据库之间保存数据。 JPA充当面向对象的领域模型和关系数据库系统之间的桥梁。由于JPA只是一个规范,它本身不执行任何操作。 它需要一个实现。 因此,像Hibernate,TopLink和iBatis这样的ORM工具实现了JPA数据持久性规范。 JPA版本 作为EJB 3.0规范的一部分,Java持久API的第一个版本JPA 1.0于2006年发布。 以下是在JPA规范下发布的其他开发版本: - JPA 2.0 - 此.

481

jpa和hibernate_JPA和Hibernate的Java持久性,第1部分:实体和关系

jpa和hibernate Java Persistence API(JPA)是一种Java规范,可在关系数据库和面向对象的编程之间架起桥梁。 这个由两部分组成的教程介绍了JPA,并说明了如何将Java对象建模为JPA实体,如何定义实体关系以及如何在Java应用程序中将JPA的EntityManager和Repository模式一起使用。 请注意,本教程使用Hibernate作为JPA提供程...

cxu0262的博客 254

JPA 查询的类型

在本教程中,我们将讨论不同类型的JPA查询。此外,我们将专注于比较它们之间的差异,并扩展每个它们的优缺点。首先,让我们定义将用于本文所有示例的UserEntity类: JPA 查询有三种基本类型:让我们探索它们。查询在语法上类似于 SQL,通常用于执行 CRUD 操作: 此查询从用户表中检索匹配的记录,并将其映射到用户实体对象。还有两个额外的查询子类型:让我们看看它们的实际效果。我们需要注意前面示例中的return语句。JPA 无法推断查询结果类型是什么,因此,我们必须强制转换。但是,JPA 提供了

allway2的博客 1301
上一篇: Java持久性API(JPA)第2讲——完成信息添加
下一篇: Java持久性API(JPA)第4讲——删除和修改.doc
Java_Web_Book
博客等级 码龄18年 8粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值