目前我是这样做的:
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)
与 findAll
从 simpleJPARepository
. 现在我可以用链子把它们连在一起了 .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
声明?
1条答案
按热度按时间mbjcgjjk1#
我不知道我是否完全理解你的问题,但是关于空值的可能性,以及使用crud存储库,你可以在执行以下操作之前进行空值检查:
根据您试图实现的目标,您可以使用类似的检查组合查询,例如(与代码无关):