jpa之jpql查询

JPQL介绍
JPQL语言,即 Java Persistence Query Language 的简称。JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。如果会hibernate的hql查询,那么jpql会上手的很快。
JPQL语言的语句可以是 select 语句、update 语句或delete语句,它们都通过 Query 接口封装执行。
Query接口封装了执行数据库查询的相关方法。调用 EntityManager 的 createQuery、create NamedQuery 及 createNativeQuery 方法可以获得查询对象,进而可调用 Query 接口的相关方法来执行查询操作。

实体类User和Order如下

@Entity
@Table(name = "t_user")
public class User {@Id//必须指定主键@GeneratedValue(strategy=GenerationType.IDENTITY)private Long id;@Column(name="user_name")private String userName;private String password;private String telephone;private String email;@Column(name="create_time")@Temporal(TemporalType.DATE)private Date createTime;@JoinColumn(name="user_id")@OneToMany(cascade=CascadeType.REMOVE)private Set<Order> orders = new HashSet<>();//映射必须定义个空构造器public User() {}public User(String userName, String password, String telephone, String email, Date createTime) {this.userName = userName;this.password = password;this.telephone = telephone;this.email = email;this.createTime = createTime;}public String getUserInfo(){return "username:"+this.userName+",email:"+this.email;}get、set、toString方法
}
@Entity
@Table(name = "t_order")
public class Order {@Id@GeneratedValueprivate Long id;//付款金额private Integer payment;//支付方式 0:支付宝 1:微信private Integer channel;//支付状态private Integer status=0;//创建时间@Column(name="create_time")@Temporal(TemporalType.DATE)private Date createTime;//单向多对1,很智能,数据库中会出现关联字段user_id,或者自己指定外键列名@ManyToOne(targetEntity=User.class,fetch=FetchType.LAZY)private User user;public Order() {}public Order(Integer payment, Integer channel, Integer status, Date createTime) {this.payment = payment;this.channel = channel;this.status = status;this.createTime = createTime;}get、set、toString方法
}

数据库表如下:
这里写图片描述

public class JpqlTest {private EntityManager entityManager;private EntityManagerFactory entityManagerFactory;private EntityTransaction transaction;@Beforepublic void init(){entityManagerFactory = Persistence.createEntityManagerFactory("jpa-2");entityManager = entityManagerFactory.createEntityManager();transaction = entityManager.getTransaction();transaction.begin();}@Afterpublic void destory(){transaction.commit();entityManager.close();entityManagerFactory.close();}@Test/** 创建查询对象三种方式:1、createQuery();* 获取单一(实体类)查询结果:query.getSingleResult()*/public void testJpql(){//1、创建jpql语句(SELECT u可以省去)String jpql = "SELECT u FROM User u WHERE u.id=?";//2、创建查询对象Query query = entityManager.createQuery(jpql);//3、设置查询参数,位置从1开始query.setParameter(1, 18l);//4、执行查询(返回单一实体查询结果)User user = (User)query.getSingleResult();System.out.println(user.getUserInfo());System.out.println(user.getOrders().size());}
}
控制台输出:
Hibernate: selectuser0_.id as id1_2_,user0_.create_time as create_t2_2_,user0_.email as email3_2_,user0_.password as password4_2_,user0_.telephone as telephon5_2_,user0_.user_name as user_nam6_2_ fromt_user user0_ whereuser0_.id=?
username:Hession,email:hession@qq.com
Hibernate: selectorders0_.user_id as user_id6_2_1_,orders0_.id as id1_1_1_,orders0_.id as id1_1_0_,orders0_.channel as channel2_1_0_,orders0_.create_time as create_t3_1_0_,orders0_.payment as payment4_1_0_,orders0_.status as status5_1_0_,orders0_.user_id as user_id6_1_0_ fromt_order orders0_ whereorders0_.user_id=?
2

一对多默认就是延迟加载,所以会发送2条sql语句分别查询User信息和Order信息。
api:

  • entityManager.createQuery(jpql):创建jpql查询对象
  • query.setParameter(position, id):设置查询参数
  • query.getSingleResult():执行查询,返回单一实体

    注:jpql的编写基本跟hql一样,都是面向对象查询

    @Test/** 获取查询实体集合:query.getResultList()*/public void testJpql2(){//1、创建jpql语句(SELECT u可以省去)String jpql = "SELECT u FROM User u WHERE u.id >?";//2、创建查询语句Query query = entityManager.createQuery(jpql);//3、设置查询参数,位置从1开始query.setParameter(1, 10l);//4、执行查询(返回查询的实体集合)List<User> list = query.getResultList();for (User user : list) {System.out.println(user.getUserName());}}
控制台输出:
Hibernate: select略...
Lucy
jackson
Hession

api:
query.getResultList():返回查询到的实体集合

@Test/** 创建查询对象三种方式:2、createNamedQuery();* 前提:在查询实体上添加注解,并设置好name及查询语句* 这里需要在User实体类上添加* @NamedQuery(name="jpqlNamedQuery",query="SELECT u FROM User u WHERE u.id=1l")*/public void testJpql3(){//传入的字符串即为实体类上定义的name属性Query query = entityManager.createNamedQuery("jpqlNamedQuery");User user = (User)query.getSingleResult();System.out.println(user.getUserInfo()); }

api:
entityManager.createNamedQuery(“jpqlNamedQuery”):查询语句写在实体类上,设置好name,从而创建查询语句,这种方式在hibernate中也有,不过hibernate是把这些写在了配置文件中。

    @Test/** 创建查询对象三种方式:3、createNativeQuery();*/public void testJpqlNative(){String sql = "SELECT u.user_name FROM t_user u WHERE u.id=?";Query query = entityManager.createNativeQuery(sql);query.setParameter(1, 1l);Object result = query.getSingleResult();System.out.println(result); }

api:
entityManager.createNativeQuery(sql):传入的是sql语句,得到的是Object对象或者泛型为Object的list。

    @Test/** 查询部分属性然后封装为实体类* 默认情况下,若只查询部分属性,则将返回Object[]类型的结果.或者Object[]类型的list* 也可以在实体类中创建对应的构造器,然后再JPQL语句中利用对应的构造器返回实体类的对象*/public void testJpql4(){String jpql = "SELECT u.userName,u.telephone FROM User u";Query query = entityManager.createQuery(jpql);List<Object[]> list = query.getResultList();for (Object[] objs : list) {for (Object object : objs) {System.out.println(object);}}}@Testpublic void testJpql5(){String jpql = "SELECT new User(u.userName,u.telephone) FROM User u";Query query = entityManager.createQuery(jpql);List<User> list = query.getResultList();for (User user : list) {System.out.println(user.getUserName());}}

输出结果分别为:

Torra
15922222226
Torra
13922222226
Lucy
15522222226
jackson
13322222226
Hession
15822222226
Torra
Torra
Lucy
jackson
Hession

1、分页查询

    @Testpublic void testJpql6(){String jpql = "SELECT u FROM User u WHERE u.id>?";Query query = entityManager.createQuery(jpql);query.setParameter(1, 1l);//分页查询,下标1开始,查询2条query.setFirstResult(1);query.setMaxResults(2);List<User> list = query.getResultList();for (User user : list) {System.out.println(user);}}

api:
query.setFirstResult(pageNum):设置分页查询下标开始位置;
query.setMaxResults(pageSize):设置分页查询记录条数;

控制台输出:
Hibernate: selectuser0_.id as id1_2_,user0_.create_time as create_t2_2_,user0_.email as email3_2_,user0_.password as password4_2_,user0_.telephone as telephon5_2_,user0_.user_name as user_nam6_2_ fromt_user user0_ whereuser0_.id>? limit ?, ?
User [id=13, userName=Lucy, password=123456, telephone=15522222226, email=lucy@qq.com]
User [id=14, userName=jackson, password=123456, telephone=13322222226, email=14]

2、排序
按照id降序排列

@Test//排序public void testJpql7(){String jpql = "SELECT u FROM User u WHERE u.id>? ORDER BY u.id DESC";Query query = entityManager.createQuery(jpql);query.setParameter(1, 1l);List<User> list = query.getResultList();for (User user : list) {System.out.println(user);}}

排序语句跟sql语句一样,直接使用ORDER BY 字段 排序方式。
另外Group By,having,函数,都是跟写sql语句一样。

3、DML语句
修改id为14的用户的用户名和邮箱

@Testpublic void testJpql8(){String jpql = "UPDATE User u SET u.userName=? , u.email=? WHERE u.id=?";Query query = entityManager.createQuery(jpql);query.setParameter(1, "LuoB");query.setParameter(2, "luob@foxmail.com");query.setParameter(3,14l);query.executeUpdate();}
控制台输出:
Hibernate: updatet_user setuser_name=?,email=? whereid=?

查看数据库t_user表
这里写图片描述

说到这里,感觉还是hibernate的hql和qbc查询好用,而jpa也只是hibernate的一个子集,即使jpa与spring整合了(确实可以整合)似乎也没hibernate好用,但是jpa的好用之处不在这,在于它和spring data 的结合使用,而spring data与关系型数据库结合中并没有hibernate只有jpa(有mybatis),所以要会spring data + jpa得先知道jpa,用了spring data之后就能体会到快速开发的感觉了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/143491.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

JPA之JPQL

文章目录 什么是JPQL?JPQL怎么用&#xff1f;JPQL的查询demoJPQL的占位符与入参问题修改demo删除demo插入demo 什么是JPQL? 所谓JPQL&#xff0c;就是Java Persistence Query Language的缩写&#xff0c;也就是java持久化查询语言&#xff0e;JPQL是一种可移植的查询语言&am…

JPQL-Query查询实例详解

前面学习了JPQL语言和Query接口。这里学习一下如果通过JPQL和Query接口进行数据的查询、更新和删除。 【1】普通查询 首先说明一下FROM子句和Select…FROM。 from 子句是查询语句的必选子句。 Select 用来指定查询返回的结果实体或实体的某些属性。 From 子句声明查询源实体…

JPQL和SQL的比较

前言 在JAVA EE中&#xff0c;JPQL是专门为Java 应用程序访问和导航实体实例设计的。Java Presistence Query Language(JPQL)&#xff0c;java持久性查询语言。它是JPA规范的重要组成部分&#xff0c;其实它就是一种查询语言&#xff0c;语法类似于SQL语法&#xff0c;但是有着…

【JPQL】--JPQL和SQL的比较

前言 在JAVA EE中&#xff0c;JPQL是专门为Java 应用程序访问和导航实体实例设计的。Java Presistence Query Language(JPQL)&#xff0c;java持久性查询语言。它是JPA规范的重要组成部分&#xff0c;其实它就是一种查询语言&#xff0c;语法类似于SQL语法&#xff0c;但是有着…

JPQL

JPQL&#xff08;JavaPersistence Query Language&#xff09;&#xff0c;是基于实体的查询&#xff0c;所查询的内容都是实体或实体属性。 1、查询实体 SELECT c FROM Customer c JPQL语句与SQL基本类似&#xff0c;但它是基于实体的查询。在初次使用时&#xff0c;需要注…

JPQL查询

JPQL查询 1 jpql的介绍 sql&#xff1a;查询的是表和表中的字段。 jpql&#xff1a;查询的是实体类和类中的属性。 jpql和sql语句的语法相似。 JPQL全称Java Persistence Query Language 基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的…

JPQL详解

前提 最近在改bug的时候发现了自己的缺点&#xff0c;在改前端bug的时候非常顺利顺手。但是在改后端bug的时候如果遇到不是太难的问题还可以解决&#xff0c;但是一到难点感觉自己就懵逼&#xff01; 所以讲解了关于JPQl相关内容 JPA 在说jpql之前必须要说一下什么是JPA&…

JPA(4) JPQL一些简单的查询语法

JPQL --> JPA Query Language --> JPA的查询语句 (另外HQL:Hibernate的查询语句) JPQL本质&#xff1a;JPA通过antlr-2.7.7.jar将JPQL编译成sql并且封装执行的。 JPQL和SQL区别&#xff1f;&#xff1f; --> 它们查询的关键字都是一样的&#xff…

6月3号抖音显示服务器维护中,抖音搜索功能升级维护 期间无法进行用户搜索

这两天有很多小伙伴说抖音上的搜索功能搜不到人了&#xff0c;这是怎么回事呢&#xff1f;其实&#xff0c;这两天&#xff0c;抖音的搜索功能正在升级维护&#xff0c;所以导致搜索功能暂时无法使用。 类别&#xff1a;影音娱乐 大小&#xff1a;210.36M 语言&#xff1a…

java抖音获取用户信息失败_为什么抖音用id搜不到用户?抖音用id搜不到用户的原因与解决方法...

在抖音短视频上&#xff0c;网友可以通过抖音id来搜索指定的抖音用户&#xff0c;并添加为好友&#xff0c;不过&#xff0c;这几天&#xff0c;不断有网友反映一个问题&#xff0c;那就是&#xff1a;抖音用id搜不到用户&#xff0c;那么&#xff0c;为什么抖音用id搜不到用户…

【已解决】抖音如何取消关注已注销的账户

文章目录 1. 按2. 操作步骤 1. 按 我们有时候会发现自己的关注列表里有一些用户显示该用户已注销&#xff0c;这时我们想取消关注&#xff0c;但是却发现没有取消关注按钮&#xff0c;怎么办呢&#xff1f;其实我们可以记下这个账号的名字&#xff0c;然后到关注列表的最上方搜…

最近抖音上虚拟元宇宙项目-猜歌名,代码解析

介绍一下最近抖音上元宇宙虚拟项目猜歌名&#xff0c;直播游戏。用户互动猜歌名&#xff0c;30秒后自动切歌。 CSDN项目源码&#xff1a;https://download.csdn.net/download/u010978757/85326344 类似的弹幕互动游戏除了猜歌名&#xff0c;还有挤地铁、广场舞和舞厅蹦迪的&a…

抖音小店无货源是不是在割韭菜?

哈喽&#xff0c;大家好&#xff0c;我是布丁。 最近很多小伙伴私信布丁&#xff0c;问抖音小店无货源是不是在割韭菜? 今天布丁腾出了些时间&#xff0c;来和小伙伴们分享一下抖音小店无货源。希望能帮助小伙伴解决问题。 抖音小店 抖音小店依托抖音&#xff0c;所以会获得…

抖音快手短视频如何快速上热门

抖音快手短视频怎么上热门?这是许多抖友的一个烦恼! 抖音快手短视频怎么上热门?这也是许多都有的一个梦想! 抖音快手短视频怎么火&#xff0c;抖音快手短视频怎么上热门&#xff0c;相信玩抖音快手短视频的人都想知道其中的技巧。今天我们就把最详细的教程分享给大家。 下面分…

抖音小店无货源怎么做?具体步骤讲解,经验分享

哈喽&#xff0c;大家好&#xff0c;我是布丁。 废话不多说&#xff0c;直接上干货。 抖音小店无货源是什么&#xff1f; 抖音小店就是在抖音上开一家小店&#xff0c;抖音小店是一个电商平台&#xff0c;无货源是一种操作模式。 无货源模式就是在网上采集其他店铺的商品&a…

抖音快手短视频剪辑工具

新媒体短视频运营中短视频制作是较为重要的一环&#xff0c;而短视频制作时选择一款适合的短视频剪辑工具会达到事半功倍的效果&#xff0c;你的短视频需要深入用户内心&#xff0c;契合短视频自身的特色和要求&#xff0c;否则吐血写的脚本、拍完视频信心满满准备剪视频打开电…

抖音快手短视频平台营销技巧

随着碎片化的加剧&#xff0c;短视频平台依靠其时长短、数据流量的优势持续吸引大量用户。而今年的疫情危机&#xff0c;给社会带来了非常大的影响。在这次疫情中&#xff0c;在承担社会责任的同时&#xff0c;抖音快手短视频平台的逆转营销也是做得很成功&#xff0c;这种平台…

抖音快手短视频推广方式

之前的快手短视频主要集中在三四线城市以及农村等消费力不强的用户群体上&#xff0c;没能有力的抓住主流用户的眼光;如今在一二线城市大放异彩的抖音短视频让厂商们再也无法无视短视频对于用户的吸引力。有了短视频这一全新渠道&#xff0c;怎么更为有效的利用渠道成了各级厂商…

抖音短视频运营指南

最初在中国的视频分享应用程序刚刚在全球激增&#xff0c;成为了2019年全球青年最热的地方。而且&#xff0c;在人群中&#xff0c;品牌营销人员紧跟它的步伐。但是抖音并不是您常规的即插即用营销平台&#xff0c;因为它的用户具有很高的洞察力&#xff0c;任何感觉不到“真实…

当年轻人开始拼命戒抖音

原创 | 开菠萝财经 作者 | 金玙璠 编辑 | 瑟曦 “再玩一次就戒掉抖音。” “戒抖音第X天。” “有没有戒掉抖音的好方法&#xff1f;我又‘复吸’了。” 就像不知道何时对抖音上瘾一样&#xff0c;不知道从什么时候起&#xff0c;越来越多年轻人开始寻求戒掉抖音的方法&#xf…