3.3.1 查询——JPQL/HQL

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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指定不同的列,返回特定的数据类型。


Info: Sourcing environment configuration script /opt/module/flume/conf/flume-env.sh Info: Including Hadoop libraries found via (/opt/module/hadoop-3.3.1/bin/hadoop) for HDFS access Info: Including Hive libraries found via (/opt/module/apache-hive-3.1.3-bin) for Hive access + exec /opt/module/jdk1.8.0_311/bin/java -Xmx20m -cp &#39;/opt/module/flume/conf:/opt/module/flume/lib/*:/opt/module/hadoop-3.3.1/etc/hadoop:/opt/module/hadoop-3.3.1/share/hadoop/common/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/common/*:/opt/module/hadoop-3.3.1/share/hadoop/hdfs:/opt/module/hadoop-3.3.1/share/hadoop/hdfs/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/hdfs/*:/opt/module/hadoop-3.3.1/share/hadoop/mapreduce/*:/opt/module/hadoop-3.3.1/share/hadoop/yarn:/opt/module/hadoop-3.3.1/share/hadoop/yarn/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/yarn/*:/opt/module/apache-hive-3.1.3-bin/lib/*&#39; -Djava.library.path=:/opt/module/hadoop-3.3.1/lib/native org.apache.flume.node.Application -n a1 -f job/fast_food_kafka_to_hdfs_db.conf - Dflume.root.logger=INFO,console SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/module/flume/lib/log4j-slf4j-impl-2.18.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/module/hadoop-3.3.1/share/hadoop/common/lib/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/module/apache-hive-3.1.3-bin/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
03-25
### 解决SLF4J Multiple Bindings问题 当在Flume与Hadoop和Hive集成时遇到`multiple SLF4J bindings`问题,通常是因为存在多个版本的SLF4J日志实现库被加载到了classpath中。这种冲突会干扰应用程序的日志记录功能并可能导致异常行为。 #### 原因分析 该问题是由于Hive自带了Hadoop中的某些依赖文件,而这些文件可能包含了不同的SLF4J绑定实现。如果在同一环境中运行Hive、Hadoop以及Flume,则可能会导致重复加载相同的SLF4J绑定[^1]。具体来说: - **Hive** 和 **Hadoop** 都各自携带了自己的 `slf4j-log4j` 或其他类似的日志框架绑定。 - 当两者同时存在于同一个classpath下时,就会触发此警告或错误消息。 #### 解决方法 以下是几种常见的解决方案来处理这个问题: 1. **移除冗余的SLF4J绑定** 删除Hive lib目录下的多余SLF4J绑定Jar包可以有效解决问题。需要注意的是绝对不能删除Hadoop中的相应jar包,否则会影响Hadoop正常工作[^3]^,^[^4]。 ```bash rm $HIVE_HOME/lib/slf4j-log4j*.jar ``` 2. **统一使用单一的日志框架** 可以考虑在整个项目范围内标准化使用的日志框架版本。例如强制指定只允许一种具体的SLF4J binding jar存留于最终打包后的应用里。通过Maven或者Gradle构建工具管理依赖关系有助于达成这一目标[^2]. 3. **调整CLASSPATH设置** 修改环境变量CLASSPATH优先级顺序使得只有期望的那个特定路径上的slf4j-api.jar及其配套binding会被实际加载进来。这样即使其它地方还保留着额外拷贝也不会造成影响. 4. **屏蔽多余的logback-classic或其他竞争者** 如果发现除了上述提到的情况之外还有别的第三方组件引入了新的logger实现(比如Logback),那么同样应该采取措施排除它们的影响范围外除非确实需要用到那个特性. 以上任意一种方式都可以帮助消除此类告警信息从而让整个系统更加稳定可靠地运作下去. ```python # 示例Python脚本用于自动化清理过程 (仅供参考) import os def remove_slf4j_jars(directory): for filename in os.listdir(directory): if &#39;slf4j&#39; in filename and (&#39;log4j&#39; in filename or &#39;bind&#39; in filename): file_path = os.path.join(directory,filename) try: if os.path.isfile(file_path): print(f&#39;Removing {file_path}&#39;) os.remove(file_path) except Exception as e: print(e) hive_lib_dir=&#39;/path/to/hive/lib&#39; remove_slf4j_jars(hive_lib_dir) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值