使用criteria builder api在jpa中实现java自定义查询连接

tzcvj98z  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(321)

目前我是这样做的:

List<Table1Entity> findAllMatchingEntities(Table1Entity table1Entity) {
    String queryString = "SELECT table1.* FROM table1 " 
                    + "JOIN table2 t2 ON table1.id=t2.table1_id";

    if (table1Entity.getName() != null) {
          queryString +=" where name like ?";                 
    }

    Query query = em.createNativeQuery(queryString, Table1Entity.class);

    if (table1Entity.getName() != null) {
        query.setParameter(1, table1Entity.getName())    
    }

    return query.getResultedList();
}

如果我想在这个连接中检查更多的参数,这将很快变成很多if语句,正确设置参数将非常复杂。
我知道我可以用criteria builder api检查参数,如下所示:

if(table1Entity.getName() != null) {
    table1EntitySpecification = (root, query, criteriaBuilder)
                         -> criteriaBuilder.like(
                            criteriaBuilder.lower(root
                           .get("name")),
                           ("%" + table1Entity.getName() + "%")
                           .toLowerCase());;
}

在那之后,让他们都有: findAll(table1EntitySpecification)findAllsimpleJPARepository . 现在我可以用链子把它们连在一起了 .or 或者 .and 避免设置参数和检查 null 第二次。
但我该怎么加入呢 criteria APi ?
我知道我可以在我的 @Repository 像这样:

@Query(value = "SELECT table1.* FROM table1 JOIN table2 t2 ON table1.id=t2.table1_id", nativeQuery = true)
List<Table1Entity> findAllMatchingEntities(Table1Entity table1Entity);

但是自从 name 是可选的(可以是 null )我不能把它留在家里 @Query .
在这里,避免使用本机查询和检查许多参数以避免使用本机查询的最佳解决方案是什么 if 声明?

mbjcgjjk

mbjcgjjk1#

我不知道我是否完全理解你的问题,但是关于空值的可能性,以及使用crud存储库,你可以在执行以下操作之前进行空值检查:

@Query(value = "SELECT table1.* FROM table1 JOIN table2 t2 ON table1.id=t2.table1_id WHERE table1.id is not null", nativeQuery = true)
List<Table1Entity> findAllMatchingEntities(Table1Entity table1Entity);

根据您试图实现的目标,您可以使用类似的检查组合查询,例如(与代码无关):

@Query("SELECT c FROM Certificate c WHERE (:id is null or upper(c.id) = :id) "
           + "and (:name is null or upper(c.name) = :name)")
List<Table1> findStuff(@Param("id") String id,
                       @Param("name") String name);

相关问题