3.3.1 查询——JPQL/HQL

本文介绍了JPQL和HQL在Hibernate中的查询机制,这两种查询语言是非类型安全的,而Criteria查询提供了类型安全的选项。在JPQL中,from子句可以直接跟类名,Select子句在查询实体对象时可省略。通过EntityManager或Session可以创建Query对象,支持命名参数和构造器查询。同时,文章提到了函数在HQL/JPQL中的应用,以及如何执行本地SQL查询,但本地SQL查询不被推荐使用。

Hibernate查询语言(HQL)和Java Persistence查询语言(JPQL)都是对象模型,它们都将查询语言与SQL类似。JPQL是HQL的子集。JPQL查询始终是一个有效的HQL查询,但反过来则不一定成立。

HQL和JPQL都是非类型安全的执行查询操作的方法。Criteria查询提供了一种类型安全的查询方法

1、JPA Query

通过EntityManager取得javax.persistence.Query 或javax.persistence.TypedQuery

主要接口

Query : 基本的查询对象

TypedQuery : Query的子接口,类型化的查询对象,支持泛型,推荐使用类型化查询

JPQL/HQL

from子句:from 后面可以直接跟着类名,别名不是必须的,where语句就必须在from的后面。

Select子句:查询一个实体对象的时候,不需要select子句

select 别名 from 类名 别名 where 条件

select 别名.属性 from 类名 别名 where 条件

(1)基本查询

Query query = super.entityManager.createQuery("from ArticleType");
List<?> list = query.getResultList();//获取查询结果集合

(2)带参数的查询

  在JPQL/HQL里面,参数如果是 : 开头的 表示【命名参数】,不能用【数字】给参数赋值,而是要使用名字
  如果就是要使用数字来设置参数,则把命名参数改为 ?


(3)使用构造器查询

select new 类名(别名.属性,别名.属性) from类名别名

构造器的这种查询使用较少,把查询出来的部分属性,通过类的构造器传入给对象,创建类名对应的对象。

构造器必须要有【无参构造器】,否则其他创建对象,存储对象到数据库的语句会出问题。以及select的时候new所需要的匹配构造器!

有多个User类的情况下应写全限定类名。


2、Hibernate Query

通过 Session 获取 org.hibernate.query.Query。

除了创建Query对象以及取得结果与JPA不一样,其余设置参数一致

org.hibernate.query.Query query = session.createQuery(...);

3、函数

聚集函数(Aggregate)
count
min
max
sum
avg

标量函数
Concat 字符串连接
SUBSTRING 截取字符串
UPPER 转换为大写
LOWER 转换为小写
TRIM 去掉头尾空格
LENGTH 属性内容的长度
LOCATE 接收两个参数,定位第一个参数的内容,在第二个参数的位置,类似于String里面的indexOf方法。
ABS 绝对值
MOD 求余
SQRT 平方根
CURRENT_DATE 当前日期,没有时分秒
CURRENT_TIME 当前时间,没有年月日
CURRENT_TIMESTAMP 当前日期、时间


注意:虽然HQL/JPQL大部分的函数、查询方式,都跟SQL差不多,只是在HQL/JPQL里面不能使用数据库的字段,只能使用类里面的【属性名】。

eg:

String hql = "select sum(o.number) from OrderItem o where o.order=:order";

String hql = "select size(o.items) from Order o where o.id=:id";

String hql = "select MAXELEMENT(o.items) from Order o where o.id=:id";

4、本地的SQL语句(Native SQL Queries)

不推荐使用。查询结果默认是Object[],可以通过addScalar指定不同的列,返回特定的数据类型。


<think> 嗯,用户想理解scrcpy 3.3.1运行时输出的信息含义。虽然系统给出的引用是关于Maven和Spring Boot的,但用户的问题明显是关于Android投屏工具scrcpy的,看来引用内容可能被错误关联了。 用户提供的输出信息包含几个关键部分: 首先注意到"ADB device found: (tcpip) 218.107.7.84:7401"这是指scrcpy通过ADB协议发现了运行在指定IP和端口上的设备。这种TCP连接方式说明设备是通过网络连接的,而不是USB直连。 接着"device msmnile_gvmq_for_arm64"特别值得关注,msmnile是高通骁龙855平台的代号,gvmq可能是厂商自定义标识,arm64则明确指示设备架构。这部分信息对开发者调试很有价值。 最后关于scrcpy-server的推送记录显示文件传输成功,这个核心组件负责在设备端建立视频中继服务。数字"1 file pushed, 0 skipped"明确说明服务端组件部署顺利。 考虑到用户询问输出含义,可能正处于调试阶段。ta应该需要知道每个字段的技术定义,以及正常/异常状态的区分标准。虽然引用内容不相关,但可以跳过那些无关的Maven参考,专注解释scrcpy特有的输出语义。 用户能提供具体版本号3.3.1很好,说明ta具备基础的技术观察能力。不过输出中没有错误提示,看起来更像是常规启动日志,或许ta真正想确认的是连接是否正常? </think> 好的,我们来解析 `scrcpy 3.3.1` 运行时的输出信息含义: ```bash ADB device found: --> (tcpip) 218.107.7.84:7401 device msmnile_gvmq_for_arm64 /opt/homebrew/Cellar/scrcpy/3.3.1_1/share/scrcpy/scrcpy-server: 1 file pushed, 0 skipped ``` **逐行解析:** 1. **`ADB device found: --> (tcpip) 218.107.7.84:7401 device msmnile_gvmq_for_arm64`** * **`ADB device found:`**: 这是核心信息,表明 `scrcpy` 通过 Android Debug Bridge (`ADB`) 成功发现了一台连接的 Android 设备。 * **`--> (tcpip) 218.107.7.84:7401`**: 这描述了设备是如何连接的。 * **`(tcpip)`**: 表示设备是通过 **TCP/IP 网络**连接的,而不是通过 USB 物理线缆连接的。这通常发生在你之前运行过 `adb connect 218.107.7.84:7401` 命令将设备连接到 ADB 服务器。 * **`218.107.7.84:7401`**: 这是设备的 **IP 地址 (`218.107.7.84`) 和端口号 (`7401`)**。ADB 服务器通过这个网络地址与你的安卓设备通信。 * **`device msmnile_gvmq_for_arm64`**: 这是识别到的设备的标识符。 * **`device`**: 表明 ADB 成功识别出该连接是一个有效的安卓设备,并且具有必要的授权(开发者选项和USB调试已开启)。 * **`msmnile_gvmq_for_arm64`**: 这是设备的 **`ro.product.device`** 属性值。 * **`msmnile`**: 通常指代使用 **高通骁龙 855 或 855+** 处理器平台(代号 `msmnile`)的设备。 * **`gvmq`**: 通常是设备制造商或特定设备型号的内部代号。这有助于识别是哪个品牌/型号的设备。 * **`for_arm64`**: 明确指出设备运行的是 **64 位 (`arm64-v8a`)** 的 Android 系统。 * *总结*: 这一行告诉你 `scrcpy` 找到了一台连接在网络地址 `218.107.7.84:7401` 上的安卓设备,该设备基于高通骁龙 855(+) 平台,是 64 位系统,内部代号包含 `gvmq`。 2. **`/opt/homebrew/Cellar/scrcpy/3.3.1_1/share/scrcpy/scrcpy-server: 1 file pushed, 0 skipped`** * **`/opt/homebrew/Cellar/scrcpy/3.3.1_1/share/scrcpy/scrcpy-server`**: 这是 `scrcpy` **服务端组件 (`scrcpy-server`)** 文件在你本地电脑(运行 `scrcpy` 的机器,这里是 macOS,因为你使用了 Homebrew 安装路径)上的存储路径。`scrcpy` 的核心工作原理是在电脑端运行一个客户端,同时在连接的安卓设备上运行一个服务端 (`scrcpy-server`) 来处理屏幕捕获、编码和事件传输。 * **`: 1 file pushed, 0 skipped`**: 这描述了将服务端组件推送到设备的过程。 * **`1 file pushed`**: 表示 **成功推送了 1 个文件**。这个文件就是 `scrcpy-server`。每次 `scrcpy` 启动时,它都会检查设备上是否已经存在一个兼容版本的 `scrcpy-server`。如果不存在,或者设备的版本过旧,或者电脑端的版本更新,`scrcpy` 就会自动将电脑上的 `scrcpy-server` 文件推送到安卓设备的临时目录(通常是 `/data/local/tmp/`)。 * **`0 skipped`**: 表示 **没有跳过推送**。这意味着设备上要么不存在 `scrcpy-server`,要么存在的版本与本次运行的 `scrcpy` 客户端版本 (`3.3.1`) 不兼容,因此需要重新推送。如果设备上已经存在一个兼容版本的 `scrcpy-server`,输出会是 `0 file pushed, 1 skipped`,表示跳过了推送(重用已有的文件),这样启动速度会更快。 **总结整个输出:** 1. `scrcpy` 成功通过 ADB 发现了一台通过网络 (`tcpip`) 连接的安卓设备,地址是 `218.107.7.84:7401`。 2. 该设备被识别为基于高通骁龙855平台 (`msmnile`) 的 64 位 (`arm64`) 设备,内部代号包含 `gvmq`。 3. `scrcpy` 将位于 macOS Homebrew 安装路径下的 `scrcpy-server` 文件(版本 3.3.1)推送到了这台安卓设备上(因为设备上没有兼容版本的服务器文件)。 4. 文件推送成功,服务器组件(`scrcpy-server`)在设备上启动,接下来屏幕镜像和控制连接就会建立。 **简单说就是:找到了设备[^1],识别了设备型号[^2],部署了必要的服务端软件[^3],准备开始投屏。**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值