占位符式的查询 ( 就是采用 ? 替换查询语句中的变量 ) 是在采用 sql 的情况下经常使用的一种查询方式,也是查询时推荐使用的一种方式。
Hibernate 中的查询参数主要有两种类型:值类型和实体类型,值类型就是指一个切实的值 ( 如 String 、 int 、 List 这些 ) ,实体类型就是一个具体的实体,如编写的 User 、 Organization 等,值类型的查询和普通 sql 几乎一样,而实体类型的查询就体现了 Hibernate 的强项, ^_^ ,可以起到简化 sql 的作用,并且使得查询语句更加容易理解。
1.简单值
举例如下:
from User where u.name=:username and u.yearold=:yearold
这就是一个常见的简单值的占位符式的查询,通过这样的方式就可以把值注入到参数中:
query.setParameter(“username”,”bluedavy”);
query.setParameter(“yearold”,22);
同样, hibernate 也支持和 sql 完全相同的 ? 的方式,那么上面的语句以及注入参数的方式就变为了:
from User where u.name=? and u.yearold=?
query.setParameter(0,”bluedavy”);
query.setParameter(1,22);
推荐使用第一种,那样参数的意义更容易被理解。
2.in 查询
in 查询也是经常被使用到的一种查询,在 Hibernate 中表现出来会稍有不同,不过如果按照对象观点去看就很容易理解了,例如下面这句:
from User where u.name in (:usernameList) ;
在 Hibernate 中通过这样的方式将值注入到这个参数中:
List list=new ArrayList();
list.add(“jerry”);
list.add(“bluedavy”);
query.setParameterList(“usernameList”,list);
在 sql 中通常是组装一个由 , 连接的值来构成 in 中的参数值,而在 Hibernate 中则依照对象转化为采用 list 了, ^_^ ,是不是更方便些。
3. 实体类型
在Hibernate中关联采用的都是对象形式,表现对外就是隐藏了数据库的外键的部分,这也就对习惯使用sql查询的人带来一个问题,因为无法再操作外键字段,那么在涉及到关联的实体的查询时应该怎么做呢,我把它分为单实体和实体集合两种情况来说说。
4.单实体
单实体的查询对应到 sql 情况通常是在一对多的情况下通过多端查询同时结合一端的一些过滤条件,在 sql 中通常采用 join 的方式来实现这个,而在 Hibernate 中要实现这点就更容易了,举例如下:
User 和 Organization 是一对多,现在要查询属于组织机构名称为 ”Blogjava”
以及用户年龄大于 20 的用户:
from User where u.org.name=:orgname and u.yearold>:yearold
query.setParameter(“orgname”,”lut.cn”);
query.setParameter(“yearold”,20);
可以看到这样的查询语句比 sql 更简单多了,同时也更容易理解多了。
5.实体集合
实体集合过滤形式的查询在实际的项目中也经常会碰到,仍然用上面的例子,但改为通过 Organization 去查询:
from Organization org where org.name=:orgname and org.users.yearold>:yearold
是不是比 sql 简单多了,而且更容易理解呢, ^_^
这个时候对象化查询语句的优势就体现出来了,而不用陷入 sql 的那种关系型的通过外键进行查询的方式。
分享到:
相关推荐
允许用户自定义 HQL 或 Criteria 查询中的占位符。 - **3.4.6 Hibernate 统计信息** Hibernate 可以收集并报告运行时统计信息,这对于性能调优非常有用。 - **3.5 日志** Hibernate 使用日志框架(如 Log...
开发者定义模板文件,其中包含静态内容和占位符,Freemarker引擎会根据传入的数据模型替换这些占位符,生成最终的HTML响应。这种方式使开发者能专注于页面布局,而不需要关心如何拼接字符串生成HTML。 项目搭建过程...
通过以上详细分析,可以清晰地了解到 Hibernate 3.x 版本中关于快速启动、基础介绍、架构设计、配置管理、持久化类定义以及基本 ORM 映射的核心知识点。这些内容对于初学者理解和掌握 Hibernate 的基本用法至关重要...
- **查询语言替换**:支持使用占位符替换查询参数。 - **Hibernate统计信息**:收集并报告有关Hibernate操作的统计信息。 - **3.1.5 日志记录**:配置日志系统,记录Hibernate操作的信息。 - Hibernate支持多种...
- `createQuery("from Users where userid=:id")`:创建 HQL 查询语句,其中 `:id` 是参数占位符。 - `setString("id", id)`:设置参数值。 - `queryList.get(0)`:获取查询结果列表中的第一个对象。 #### 5. ...
- **查询语言中的替换**:使用占位符进行查询参数化。 - **Hibernate的统计(statistics)机制**:启用统计收集以获取有关Hibernate运行时行为的信息。 **3.5 日志** - **日志框架集成**:集成常见的日志框架,如...
- 参数查询:使用占位符进行查询。 - 命名参数查询:使用命名参数进行查询。 - 关联查询:查询与对象相关的其他对象。 - 分页查询:限制结果集的数量。 - 统计函数:进行聚合操作。 ### 优化 Hibernate 的方法...
2. **参数化查询**:这是预编译语句的一种形式,它使用占位符(例如问号`?`)代替具体的值,然后在执行时提供实际的参数。这确保了只有预期的数据会被插入到查询中,而不是任意的SQL命令。 3. **输入验证**:SQL...
2. 参数映射:iBATIS支持复杂的数据类型参数,如POJO(Plain Old Java Object)对象,通过`<parameterMap>`元素进行参数映射,使得传入参数与SQL中的占位符对应。 3. 结果集映射:iBATIS提供了强大的结果集映射机制...
PreparedStatement允许预编译SQL语句,并用占位符替换动态值,提高了代码的可读性和性能。 数据库连接池是另一个关键概念,特别是在处理大量并发请求时。例如,C3P0、HikariCP和Apache DBCP是常用的Java数据库连接...
`作为占位符,并通过`SqlParameterSource`或数组来传递参数。比如,查询年龄大于特定值的人员: ```java int age = 30; String sql = "SELECT * FROM Person WHERE age > ?"; List<Person> persons = jdbcTemplate....
)作为占位符,通过`addInParameter()`或`addOutParameter()`方法传递参数。 2. **事务管理**: - Spring JDBC提供了基于编程和声明式的事务管理。编程式事务管理可以通过`PlatformTransactionManager`接口实现,...
通过`update`或`execute`方法,可以传入参数化的SQL语句,并使用占位符来传递参数。 4. **批量操作**:对于需要多次执行相同SQL的情况,`JdbcTemplate`的`batchUpdate`方法可以有效地进行批量处理,提高性能。 5. ...
Spring JDBC支持多种方式绑定SQL语句中的参数,如占位符(?)、命名参数(:${param})和Positional Parameter(:p0)。同时,它也提供了结果集的自动映射功能,如`RowMapper`接口,开发者可以通过实现这个接口将结果...
3. **反射应用**:使用Java反射API,根据元数据填充模板中的占位符。 4. **生成代码**:将填充后的模板转换为实际的Java源代码文件。 5. **整合到项目**:将生成的代码文件添加到项目中,编译并测试。 这样的工具...
(3) 表示查询参数的占位符,应填入`title`;(4) 是执行查询并返回结果列表的操作,如`query.list()`。 接着,依赖注入(DI)是Spring框架的核心概念之一,它允许组件之间的依赖关系由外部容器管理,而不是组件内部...
Spring JDBC提供了一个更高级的抽象,即`NamedParameterJdbcTemplate`,它允许我们使用命名参数而不是传统的问号占位符。这使得SQL更加易读且更易于维护,例如`queryForObject(String sql, SqlParameterSource ...
5. **参数映射**:MyBatis支持基本类型、复杂对象、Map等作为参数,通过和进行映射,或者使用#{param}占位符。 6. **结果映射**:通过元素定义结果集映射,可以处理一对一、一对多、多对一、多对多的复杂关系。 7....