如何在 Spring Boot Data Jpa 应用程序中使用条件查询

新手上路,请多包涵

我有一个使用 Spring Boot Data jpa 的应用程序。到目前为止,我正在使用这样的存储库

public interface StudentRepository extends CrudRepository<StudentEntity, Integer>{
    @Query(value = ""
        + "SELECT s.studentname "
        + "FROM   studententity s, "
        + "       courseentity c "
        + "WHERE  s.courseid = c.courseid "
        + "       AND s.courseid IN (SELECT c.courseid "
        + "                          FROM   courseentity c "
        + "                          WHERE  c.coursename = ?1)")
    List<String> nameByCourse(String coursename);
}

我如何在 Spring Boot 应用程序中使用 Hibernate 为此类情况提供的 Criteria Query

原文由 Rahul 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 437
2 个回答

docs

要使用自定义功能丰富存储库,您首先定义自定义功能的接口和实现。使用您提供的存储库接口来扩展自定义接口。

像这样定义一个接口

public interface StudentRepositoryCustom {

    List<String> nameByCourse(String coursename);

}

然后像这样定义这个接口的自定义实现

@Service
class StudentRepositoryImpl implements StudentRepositoryCustom {

    @PersistenceContext
    private EntityManager em;

    public List<String> nameByCourse(String coursename) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        //Using criteria builder you can build your criteria queries.
    }

}

现在,您可以像这样在您的 JPA 存储库中扩展此自定义存储库实现。

 public interface StudentRepository extends CrudRepository<StudentEntity, Integer>, StudentRepositoryCustom {

}

了解有关条件查询和条件构建器的更多信息 here

原文由 Abdullah Khan 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 Spring-boot-jpa 您几乎可以在任何地方使用 entityManager 。最常见的方法是为自定义方法创建自己的 interface

 public interface StudentCustomRepository {

    void anyCustomMethod();
    Student getStudentByName(String name);
}

然后将此接口实现到一个服务类,您可以在其中自动装配并使用 entityManager

 @Service
public class StudentCustomRepositoryServiceImpl implements StudentCustomRepository {

     @PersistenceContext
     private EntityManager em;

     @Override
     public void anyCustomMethod(){
         //here use the entityManager
     }

     @Override
     StudentEntity getStudentByName(String name){
         Criteria crit = em.unwrap(Session.class).createCriteria(StudentEntity.class);
         crit.add(Restrictions.eq("name", name));
         List<StudentEntity> students = crit.list();
         return students.get(0);
     }
 }

您还可以决定将 StudentRepository 实施到新的 StudentCustomRepositoryServiceImpl 类中。

原文由 Patrick 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进