Spring boot 中自定义JpaRepository使用

普通JpaRepository类

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

@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long>{
}

JpaRepository一般的筛选查询,均可以通过findBy的形式解决,总的很好用,但是总有一部分的业务查询是需要JpaRepository不能解决的。这个时候,就需要在此基础上面增加自定义的Repository类了。

自定义Repository类

接口类

import java.util.List;
public interface EmployeeRepositoryCustom {
    List<Employee> getFirstNamesLike(String firstName);
}

实现类

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List;

@Repository
public class EmployeeRepositoryImpl implements EmployeeRepositoryCustom {
    @PersistenceContext
    private EntityManager entityManager;
    @Override
    public List<Employee> getFirstNamesLike(String firstName) {
        Query query = entityManager.createNativeQuery("SELECT em.* FROM spring_data_jpa_example.employee as em " +
                "WHERE em.firstname LIKE ?", Employee.class);
        query.setParameter(1, firstName + "%");
        return query.getResultList();
    }
}

**Note:**实现类的命名必须是这里实现类的命名bean名+RepositoryImpl;这里注入了EntityManager,关于它的标准查询,使用我放在后面再提。

使用自定义类Repository类

@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long>, EmployeeRepositoryCustom {
}

依旧按照JpaRepository的使用方式,只要简单继承就可以了。

EntityManager的标准查询

如果不想在java代码里面涉及太多的sql字符串,应该按照EntityManager的标准查询方式,进行数据库查询,如下:

@Repository
public class EmployeeRepositoryImpl implements EmployeeRepositoryCustom {
    @PersistenceContext
    private EntityManager entityManager;
    @Override
    public List<Employee> getFirstNamesLike(String firstName) {
        // Query query = entityManager.createNativeQuery("SELECT em.* FROM spring_data_jpa_example.employee as em " +
        //         "WHERE em.firstname LIKE ?", Employee.class);
        // query.setParameter(1, firstName + "%");
		// return query.getResultList();
		
		CriteriaBuilder builder = entityManager.getCriteriaBuilder();
		CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
		Root<Employee> root = query.from(Employee.class);
		Predicate predicate = builder.conjunction();

		predicate = builder.and(predicate,  builder.like(root.get("firstname"), "张三"));
		query.where(predicate);

		return entityManager.createQuery(query).getResultList();
    }
}

参考:

REST Query Language with Spring and JPA Criteria

1. Working with Spring Data Repositories

Add Custom Functionality to a Spring Data Repository

转载于:https://my.oschina.net/fxtxz2/blog/1925896

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值