数据过滤器注解@Filter 如何在hibernate、spring data jpa中调用

实体定义,Shops.java:

package youway.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.Filters;
import org.hibernate.annotations.ParamDef;

@Entity
@Table(name = "shops")
@FilterDef(name = "employeeFilter", parameters = { @ParamDef(name = "emplNumber", type = "integer") })
@Filters({ @Filter(name = "employeeFilter", condition = ":emplNumber <= employees_number") })
public class Shop {

	@Id
	@GeneratedValue
	private Integer id;

	/** 店铺名称 */
	private String name;

	/** 员工编号 */
	@Column(name = "employees_number")
	private Integer emplNumber;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getEmplNumber() {
		return emplNumber;
	}

	public void setEmplNumber(Integer emplNumber) {
		this.emplNumber = emplNumber;
	}
}

其中,

@FilterDef(name = "employeeFilter", parameters = { @ParamDef(name = "emplNumber", type = "integer") })
@Filters({ @Filter(name = "employeeFilter", condition = ":emplNumber <= employees_number") })

是要过滤 employees_number (数据库字段名)大于等于指定参数 emplNumber (自定义参数名)的记录


在Hibernate中调用代码片段:

    public List<Shop>  findAll(){
                Session session = HibernateUtil.getSessionFactory().openSession();
		System.out.println("--过滤生效--");
		Filter filter = session.enableFilter("employeeFilter");
		filter.setParameter("emplNumber", new Integer(24));
		session.beginTransaction();
		List<Shop> results = session.createQuery("from Shop").list();
		for(Shop: results){
			System.out.println("店铺名称:"+s.getName()+", 员工编号:"+s.getEmplNumber());
		}
		session.disableFilter("employeeFilter");
		session.close();
		return results;
    }


利用 spring data jpa定义ShopRepository.java:

package youway.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import youway.model.Shop;

public interface ShopRepository extends JpaRepository<Shop, Integer> {

}


利用 spring data jpa调用:

package youway.service;

import java.util.List;

import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hibernate.Filter;
import org.hibernate.Session;
import org.springframework.stereotype.Service;

@Service
public class ShopService{
	@PersistenceContext 
        private EntityManager entityManager;
	
	@Resource
	private ShopRepository shopRepository;

	@Transactional
	public List<Shop> findAll() {
		Filter filter = (Filter)entityManager.unwrap(Session.class).enableFilter("employeeFilter");
               filter.setParameter("emplNumber", new Integer(1000));
               List<Shop> lists = shopRepository.findAll();
               entityManager.unwrap(Session.class).disableFilter("employeeFilter");
	       return lists;
	}
}

转载于:https://my.oschina.net/youway/blog/521833

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在你的Spring Boot项目添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ``` 然后,你需要在你的application.properties文件配置数据库连接信息: ``` spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name spring.datasource.username=your_username spring.datasource.password=your_password spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect ``` 这里的spring.jpa.hibernate.ddl-auto=update会在应用程序启动时自动创建表格。 接下来,你需要创建一个实体类,如下所示: ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "email") private String email; // 省略getter和setter方法 } ``` 在这个实体类,我们使用了JPA注解来定义实体类与数据库表之间的映射关系。 最后,你需要创建一个JpaRepository接口,如下所示: ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { } ``` 这个接口继承了JpaRepository,它提供了一些基本的CRUD操作。在这个接口,我们可以定义一些自定义查询方法,如下所示: ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { List<User> findByName(String name); List<User> findByEmail(String email); } ``` 现在,你可以在你的应用程序使用UserRepository来进行数据库操作了。 ```java @Service public class UserService { @Autowired private UserRepository userRepository; public User saveUser(User user) { return userRepository.save(user); } public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } // 省略其他方法 } ``` 在这个示例,我们使用了UserRepository来保存和获取用户信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值