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

机器学习-深嵌交叉验证(Nested Cross-Validation) Section I: Code and Analyses 第一部分:代码 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from... 阅读详情
 
目标:掌握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接口部分。
 
从芯片选型到光学集成:手持激光测距仪硬件设计全解析 本文全面解析手持激光测距仪的硬件设计,从芯片选型到光学集成,详细介绍了相位法测距技术的核心原理与方案选择。通过模块化设计、信号链路优化及PCB布局技巧,实现毫米级精度。文章还分享了量产化关键控制点,帮助工程师规避常见设计陷阱,提升产品可靠性。 阅读详情

相关推荐

低代码Agent开发框架使用指南(二)—Coze平台核心功能概览

本篇分享系统介绍了字节跳动推出的低代码智能体开发平台Coze。Coze以免费易用、多模型支持和便捷的跨平台发布为核心优势,显著降低了智能体开发门槛。文章详细解析了平台的六大核心功能:扩展能力边界的插件系统、增强认知的知识库、结构化数据管理的数据库、可视化图像处理的图像流、实现复杂逻辑编排的工作流,以及处理复杂任务的多智能体协作机制,全面展现了Coze平台的强大能力。

weixin_42782643的博客 1358

Abp 数据过滤获取AbpUser表数据

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

wang4978的专栏 4440

手把手教你逆向抖店滑块验证码:从抓包到生成captchaBody的完整流程(附Python复现代码)

本文详细解析了抖店滑块验证码的逆向过程,从抓包分析到参数生成,最终用Python完整复现验证流程。涵盖关键接口分析、指纹参数生成、轨迹加密逻辑及核心加密算法实现,帮助开发者突破抖店的多重安全机制,实现高效的人机验证绕过。

weixin_30681121的博客 427

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

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

Lavi的专栏 1万+

克里金插值(Kriging)在MATLAB中的实现(克里金工具箱)

一,直接献上克里金插值MATLAB工具箱 链接:https://pan.baidu.com/s/1p0lt2G8KQ-els7Dyw5jPFg 提取码:wcss 下载后将该程序添加到MATLAB安装文件夹中的/toolbox下,然后在设置路径中添加该程序文件为默认路径即可调用程序。 资源中内附程序使用说明PDF。 二、本人实际操作代码如下所示,标注如下 load data1 %载入数据 %模型参...

qq_40937675的博客 6万+

操作系统笔记(含王道计算机考研——操作系统课件)

操作系统(OS) 笔记根据B站王道计算机考研——操作系统视频整理所得,视频链接:https://b23.tv/0I2qex 视频中所用课件:链接:https://pan.baidu.com/s/101bFWm0Tv0emNpEneidYPA 提取码:y3dd 1.计算机系统概述 1.简介 什么是操作系统? 操作系统(Operating Ststem, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是

拧发条鸟的博客 6万+

正则表达式入门-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万+

基于FPGA的DDS信号发生器

之前的博客讲到了DDS的基本原理,现在用Verilog代码实现DDS,能够产生四种波形,方波,三角波,正弦波,锯齿波,用按键来控制频率和选择波形。其中按键消抖模块来自小梅哥的FPGA自学笔记设计与验证这本书。 module DDS_Module( Clk, Rst_n, EN, Fword, Key1, Pword, DA_Clk, DA_Data ); input Clk...

qq_43534451的博客 9950

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

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

u010671028的博客 765

《物联网技术》课程笔记——第二章 物联网技术架构

文章目录第二章:物联网技术架构1 物联网技术体系(C3SD)2 系统体系结构的基本概念3 物联网体系结构——信息传递视角3.1物联网感知层3.1.1 感知层要解决的问题3.1.2 感知层的形态3.1.3 节点的感知能力与控制能力3.1.4 感知层实例3.2 物联网网络层3.2.1 网络相关概念3.2.2 IPV6与IPV4相比互联网协议的升级3.2.3 计算机网络的逻辑层次3.2.4 传输网的拓扑结构3.2.4.1 举例:智能小区的三表采集系统3.2.4.2 接入层3.2.4.2 汇聚层3.2.4.2 核心

南京大学软件工程硕士在读 2503

Zynq/ZynqMP PL端以太网实战:手把手教你用GMII to RGMII IP和EMIO打通网络(附KSZ9031 PHY驱动修改)

本文详细介绍了在Zynq/ZynqMP平台上使用GMII to RGMII IP核和EMIO接口实现PL端以太网通信的全栈开发流程,特别针对KSZ9031 PHY芯片提供了定制化驱动修改方案。内容涵盖硬件设计、Vivado配置、裸机驱动开发、Linux系统集成及实战调试技巧,帮助开发者高效解决工业控制和边缘计算中的以太网连接问题。

weixin_30642561的博客 582

python findall函数_python正则表达式之中的findall函数是什么?

在这篇文章之中我们来了解一下关于python正则表达式的相关知识,有些朋友可能是刚刚接触到python这一编程语言,对这一方面不是特别的了解,在接下来这篇文章将会来带大家来了解关于正则表达式中的python findall函数。概括在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。(注意: match 和 search 是匹配一次 findall 匹配所有...

weixin_39987138的博客 2854

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

yzhjisji的专栏 651

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

JPA的使用

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

拾玖的博客 1851

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

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

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

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
上一篇: Java持久性API(JPA)第2讲——完成信息添加
下一篇: Java持久性API(JPA)第4讲——删除和修改.doc
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值