Hibernate Example.setPropertySelector

Hibernate筛选器实现
本文介绍了一个自定义的Hibernate PropertySelector实现——MyPropertySelector,用于在查询过程中排除空值、空白字符串及数值零值的情况。通过具体代码展示了如何创建并应用这个筛选器到Hibernate的查询条件中。
MyPropertySelector


package util;

import org.hibernate.criterion.Example.PropertySelector;
import org.hibernate.type.Type;

@SuppressWarnings("serial")
public class MyPropertySelector {
private static PropertySelector NOT_NULL_BLANK_ZEROS = null;

private MyPropertySelector(){
}

public static PropertySelector getNotNullBlankZeros() {
if(NOT_NULL_BLANK_ZEROS == null){
NOT_NULL_BLANK_ZEROS = new PropertySelector() {
public boolean include(Object value, String propertyName, Type type) {
return value != null
&& (((value instanceof String) && !("").equals(value))
|| ((value instanceof Number) && ((Number) value).longValue() != 0));
}
};
}
return NOT_NULL_BLANK_ZEROS;
}

}




Criteria c = session.createCriteria(Student.class);
l = c.add(Example.create(s)
.setPropertySelector(

MyPropertySelector.getNotNullBlankZeros())

.enableLike()
).list()
从给出的不完整代码 `package com.example.spring.dao; import com.example.spring.entity.Student; org.hibernate.Sess` 来看,存在明显的语法错误。正确的 Java 代码在导入包时,`import` 语句后面应该是完整的类路径,而这里 `org.hibernate.Sess` 不完整,推测可能是想导入 `org.hibernate.Session`。 以下是一个包含 Spring 和 Hibernate 实现简单的学生信息数据访问对象(DAO)的完整示例: ```java package com.example.spring.dao; import com.example.spring.entity.Student; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class StudentDao { @Autowired private SessionFactory sessionFactory; public List<Student> findAll() { Session session = sessionFactory.getCurrentSession(); return session.createQuery("from Student", Student.class).list(); } } ``` ### 代码说明: 1. **包声明**:`package com.example.spring.dao;` 声明了该类所在的包。 2. **导入包**:导入了 `com.example.spring.entity.Student` 实体类和 `org.hibernate.Session`、`org.hibernate.SessionFactory` 用于 Hibernate 操作。 3. **`@Repository` 注解**:这是 Spring 的注解,用于将该类标记为数据访问对象(DAO),Spring 会自动扫描并管理这个类。 4. **`SessionFactory` 注入**:通过 `@Autowired` 注解将 `SessionFactory` 注入到 `StudentDao` 类中,`SessionFactory` 是 Hibernate 的核心组件,用于创建 `Session`。 5. **`findAll` 方法**:该方法用于查询所有的学生信息。首先通过 `sessionFactory.getCurrentSession()` 获取当前的 `Session`,然后使用 Hibernate 的查询语言(HQL)`from Student` 查询所有的 `Student` 对象,并将结果以列表形式返回。 ### 相关配置: 为了让 Spring 和 Hibernate 正常工作,还需要在 Spring 的配置文件(如 `applicationContext.xml` 或 Java 配置类)中进行相应的配置,以下是一个简单的示例: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 扫描组件 --> <context:component-scan base-package="com.example.spring.dao"/> <!-- 数据源配置 --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/your_database"/> <property name="username" value="your_username"/> <property name="password" value="your_password"/> </bean> <!-- Hibernate SessionFactory 配置 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="com.example.spring.entity"/> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> <!-- 事务管理器配置 --> <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> </beans> ``` ### 相关配置说明: 1. **组件扫描**:`<context:component-scan base-package="com.example.spring.dao"/>` 用于扫描指定包下的组件,包括 `@Repository` 注解的类。 2. **数据源配置**:配置了数据库连接信息,如数据库驱动、URL、用户名和密码。 3. **`SessionFactory` 配置**:使用 `LocalSessionFactoryBean` 创建 `SessionFactory`,并指定数据源和要扫描的实体类包,同时配置了 Hibernate 的一些属性,如方言、是否显示 SQL 语句和数据库表的更新策略。 4. **事务管理器配置**:使用 `HibernateTransactionManager` 管理事务,并通过 `@Transactional` 注解来标记需要事务管理的方法。 ### 调用示例: ```java import com.example.spring.dao.StudentDao; import com.example.spring.entity.Student; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.List; public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); StudentDao studentDao = context.getBean(StudentDao.class); List<Student> students = studentDao.findAll(); for (Student student : students) { System.out.println(student); } } } ``` ### 相关问题: 1. 如何在 `StudentDao` 中实现根据学生 ID 查询学生信息的方法? 2. 当数据库连接失败时,如何在 Spring 和 Hibernate 中进行异常处理? 3. 如何使用 Spring 和 Hibernate 实现学生信息的插入和更新操作? 4. 如何优化 Spring 和 Hibernate 代码的性能? 5. 在 Spring 和 Hibernate 中,如何进行多表关联查询?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值