使用Hibernate命名查询,是可以把查询sql写xml里面的。
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingDirectoryLocations">
<value>classpath:config/hibernate/hbm/</value>
</property>
</bean>
<bean id="userDao" class="com.my.dao.UserDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userService" class="com.my.service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
UserNamed.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<sql-query name="queryByName">
select
pk_id,f_name,f_createTime,f_email
from
t_hibernate_named
where
f_name = :name
</sql-query>
<sql-query name="queryByStartDateToEndDate">
select
pk_id,f_name,f_createTime,f_email
from
t_hibernate_named
where
f_createTime between :startDate and :endDate
</sql-query>
</hibernate-mapping>
一些日期处理:
DateUtils.java:
package com.my.commons.time;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.lang.time.DateFormatUtils;
public class DateUtils extends DateFormatUtils {
// 得到24小时制的年月日时分秒
public static final String YYYY_MM_DD_HH24_MM_SS = "yyyy-MM-dd HH:mm:ss";
/**
* 将日期时间字符串转换为时间型
*
* @param srcDateTime
* 待转化的日期时间字符串.
*
* @return 转化后的日期时间.
*/
public static Date string2Date(String srcDateTime) {
Date date = null;
try {
date = new SimpleDateFormat(YYYY_MM_DD_HH24_MM_SS)
.parse(srcDateTime);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
/**
* 将Date转换为Timestamp
*
* @param date
* @return
*/
public static Timestamp getTimestamp(Date date) {
return Timestamp.valueOf(format(date, YYYY_MM_DD_HH24_MM_SS));
}
/**
* 将Date转换为String
*
* @param date
* @return
*/
public static String formatYMDH24MS(Date date) {
return format(date, YYYY_MM_DD_HH24_MM_SS);
}
/**
* 将Timestamp转换为String
*
* @param timestamp
* @return
*/
public static String formatYMDH24MS(Timestamp timestamp) {
return format(timestamp, YYYY_MM_DD_HH24_MM_SS);
}
/**
* 根据 日期时间和显示模式得到String
*
* @param timestamp
* @param pattern
* @return
*/
public static String format(Timestamp timestamp, String pattern) {
return format(timestamp.getTime(), pattern);
}
}
TimeZone.java:
package com.my.commons.time;
import java.io.Serializable;
import java.util.Date;
public class TimeZone implements Serializable {
private static final long serialVersionUID = 1L;
// 起始日期
private Date startDate;
// 结束日期
private Date endDate;
//省略get、set和构造方法。
}
UserDao.java:
package com.my.dao;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.my.commons.time.TimeZone;
import com.my.po.User;
@SuppressWarnings("unchecked")
public class UserDao extends HibernateDaoSupport {
/**
* 根据名称查询
*
* @param name
* @return
*/
public List queryByName(String name) {
//"queryByName"就是UserNamed.hbm.xml里的name,
Query queryNamed = getSession().getNamedQuery("queryByName");
//"name"就是UserNamed.hbm.xml里name为queryByName的 :name 。
queryNamed.setString("name", name);
List result = queryNamed.list();
List resultList = new ArrayList();
User user = null;
for (Object obj : result) {
user = new User();
Object[] o = (Object[]) obj;
user.setId((Integer) o[0]);
user.setName((String) o[1]);
user.setCreateTime((Timestamp) o[2]);
user.setEmail((String) o[3]);
resultList.add(user);
}
return resultList;
}
/**
* 根据指定日期查询
* @param timeZone
* @return
*/
public List queryByStartDateToEndDate(TimeZone timeZone){
Query queryNamed = getSession().getNamedQuery("queryByStartDateToEndDate");
queryNamed.setTimestamp("startDate", timeZone.getStartDate());
queryNamed.setTimestamp("endDate", timeZone.getEndDate());
List result = queryNamed.list();
List resultList = new ArrayList();
User user = null;
for(Object obj : result){
user = new User();
Object[] o = (Object[])obj;
user.setId((Integer)o[0]);
user.setName((String)o[1]);
user.setCreateTime((Timestamp)o[2]);
user.setEmail((String)o[3]);
resultList.add(user);
}
return resultList;
}
}
UserService.java:
package com.my.service;
import java.util.List;
import com.my.commons.time.TimeZone;
import com.my.dao.UserDao;
import com.my.po.User;
@SuppressWarnings("unchecked")
public class UserService {
private UserDao userDao;
/**
* 根据名称查询
*
* @return
*/
public List<User> getByName(String name) {
List<User> userList = userDao.queryByName(name);
if (userList.size() > 0) {
return userList;
}
return null;
}
/**
* 根据指定日期查询
*
* @param timeZone
* @return
*/
public List<User> getByStartDateToEndDate(TimeZone timeZone) {
List<User> userList = userDao.queryByStartDateToEndDate(timeZone);
if (userList.size() > 0) {
return userList;
}
return null;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
User.java:
package com.my.po;
import java.io.Serializable;
import java.sql.Timestamp;
public class User implements Serializable{
private static final long serialVersionUID = 1L;
// ID
private int id;
// 名称
private String name;
// 创建日期
private Timestamp createTime;
// 电子邮箱
private String email;
//省略get、set和构造方法。
}
UserServiceTest.java:
package com.my.test;
import java.util.List;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.my.commons.time.DateUtils;
import com.my.commons.time.TimeZone;
import com.my.po.User;
import com.my.service.UserService;
public class UserServiceTest {
/**
* @param args
*/
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
UserServiceTest.testGetByName(userService);
// UserServiceTest.testGetByStartDateToEndDate(userService);
}
private static void testGetByName(UserService us) {
List<User> userList = us.getByName("hao");
for (User user : userList) {
System.out.println(user.getId() + " , " + user.getName() + " , "
+ user.getCreateTime() + " , " + user.getEmail());
}
}
private static void testGetByStartDateToEndDate(UserService us) {
List<User> userList = us.getByStartDateToEndDate(new TimeZone(DateUtils
.string2Date("2011-02-07 10:00:00"), DateUtils
.string2Date("2011-03-09 23:15:59")));
for (User user : userList) {
System.out.println(user.getId() + " , " + user.getName() + " , "
+ user.getCreateTime() + " , " + user.getEmail());
}
}
}
表结构:
- 大小: 29.8 KB
分享到:
相关推荐
This tutorial show how to use Hibernate/JPA Named Queries. We start by explaining why we would use named queries. Next, we show an example of how to use named queries, either with annotations or XML ...
5. **命名查询(Named Queries)**: 如果某些查询模式经常被使用,可以定义命名查询,将其写入XML映射文件中,以提高代码可读性和复用性。 6. **动态HQL**: 对于更动态的查询,可以构建HQL字符串,但这可能会...
@NamedQuery(name="User.findAll", query="SELECT u FROM User u") ``` 2. `@Query` JPA的动态查询,可以直接在注解中编写HQL或JPQL查询语句。 六、事务管理注解 1. `@Transactional` 标记在方法上,表示该...
Query<User> namedQuery = session.getNamedQuery("getUsersByName"); namedQuery.setParameter(0, "John Doe"); List<User> users = namedQuery.list(); ``` 三、Criteria API Criteria API是Hibernate提供的另一...
4. Query和NamedQuery:支持HQL和JPQL,允许预编译查询,提高执行效率。 5. Entity Manager:作为JPA的核心组件,管理Entity的生命周期,处理事务,并负责Session的透明管理。 四、配置与使用 使用Hibernate ORM...
在`hibernate.cfg.xml`或实体类的`@NamedQuery`注解中定义命名查询: ```xml <query name="getStudentsOverAge"> FROM Student WHERE age > 20 </query> ``` 在代码中使用: ```java Query query = session...
Named Query - **思想** - 将 HQL 查询定义在 XML 文件中,可以通过名称来调用这些查询。 - **目的** - 方便维护和复用 HQL 查询语句。 - **实现** - 定义 HQL 查询语句: ```xml <query name=...
6. **Query与NamedQuery**:Query接口用于执行HQL或 Criteria查询,而NamedQuery则允许预先在映射文件中定义查询,提高性能并减少重复代码。 7. **事务管理**:Hibernate支持编程式和声明式事务管理。编程式事务...
3. **Query和NamedQuery**:预定义的查询,可以在XML映射文件中定义,便于重用。 4. **Entity Graph**:用于指定加载关联实体的子集,优化数据检索。 ### 实现细节 在实际项目中,为了有效地使用Hibernate,你...
我们还将学习如何使用Criteria API进行动态查询,以及Query和NamedQuery的使用。 最后,事务管理是数据库操作中不可或缺的一部分。Hibernate支持JTA(Java Transaction API)和JPA(Java Persistence API)的事务...
总结一下,本篇文章主要讨论了如何使用Hibernate的Criteria API和HQL进行分页查询,以及如何通过`NamedQuery`和Spring Data JPA的`Pageable`接口优化这一过程。这些技术在实际开发中具有很高的实用价值,能帮助...
此方法与`Session.createSQLQuery()`类似,但可以从实体类或`@NamedQuery`中加载预定义的SQL。它支持结果集映射,包括一对一、一对多等关联关系。 ```java NativeQuery nativeQuery = session.createNativeQuery...
5. **Query和NamedQuery**:Query接口用于执行HQL查询,而NamedQuery则是在配置文件中预定义的查询,提高了代码的可重用性和性能。 6. **Transaction管理**:Hibernate支持JTA(Java Transaction API)和JDBC事务,...
- `@NamedQuery`: 预定义命名查询,可以在多个地方重用。 7. **缓存** - `@Cacheable`: 标记实体类或方法支持缓存,提高性能。 - `@Cache`: 配置缓存区域和策略,如读写策略、时间戳等。 8. **转换器与自定义...
- **查询(Query)**: `@NamedQuery`和`@NamedNativeQuery`可以预定义SQL或HQL查询,便于重复使用。 3. **使用流程**: - 配置Hibernate:创建`hibernate.cfg.xml`配置文件,指定数据库连接等信息。 - 创建实体...
例如,开发者可以通过JPQL来执行复杂的查询,或者利用@NamedQuery预先定义常见的查询。 `hibernate-commons-annotations.jar` 文件包含了Hibernate框架中常用的通用注解,这些注解扩展了标准的JPA注解,提供了更...
Query接口用于执行HQL或 Criteria 查询,而NamedQuery则是在映射文件中预先定义的查询,提高了代码的可读性和复用性。 八、Entity和Association Mapping 在Hibernate中,一个Java类可以映射为数据库中的一个表,这...
包括EntityManager、EntityManagerFactory等接口,以及Entity、@NamedQuery等注解。 3. **JTA(Java Transaction API)**: 为了处理分布式事务,Hibernate 5需要JTA来实现事务管理。JTA提供了统一的API来管理跨多...
4. **Query和NamedQuery**:预定义的查询,提高代码复用性和执行效率。 五、缓存机制 1. **一级缓存**:Session内部的缓存,自动管理,减少对数据库的直接访问。 2. **二级缓存**:可配置的外部缓存,如Ehcache,...
- 使用 NamedQuery 或 NamedNativeQuery 提前预定义查询,提高代码复用性。 - 注意避免 N+1 查询问题,合理使用 JOIN 和子查询。 11. **实体生命周期** - 新建状态(Transient):对象刚刚创建,尚未与 Session ...