Spring Data - 在运行时构建 where 子句



在 Spring 数据中,如何将更多条件附加到现有查询?

例如,我在下面有CrudRepository:

@RepositoryRestResource
public interface MyRep extends CrudRepository<MyObject, Long> {
@Query("from MyObject mo where mo.attrib1 = :attrib1")
List<MyObj> findMyObjects(String attrib1, String conditions);
}

在运行时,我需要用两个参数调用"findMyObjects"。第一个参数显然是 attrib1 的值。第二个参数将是将在运行时确定的 where 子句,例如"attrib2 像 '%xx%' 和 attrib3 在 'that' 和 'this' 和 ..." 之间"。我知道这个额外的 where 条件将是有效的,但我不知道其中会有什么属性和条件。有没有办法将此 where 子句附加到@Query注释中定义的查询中?

不幸的是,没有。没有直接的方法可以实现这一目标。

您需要使用自定义复制方法,您可以在其中注入EntityManager并直接与EntityManager.createQuery(...)交互。

或者,您可以使用规范或 QueryDsl 构建动态查询。

我最终注入了一个我在其余控制器中获得的实体管理器。在这里发布我所做的批评:

存储库代码:

@RepositoryRestResource
public interface MyRepo extends CrudRepository<MyObject, Long> {
default List<MyObject> findByRuntimeConditions(EntityManager em, String runtimeConditions) {
String mySql = "<built my sql here. Watch for sql injection.>";
List<MyObject> list = em.createQuery(mySql).getResultList();
return list
}
}

其余控制器代码:

@RestController
public class DataController {
@Autowired
EntityManager em;
// of course watch for sql injection    
@RequestMapping("myobjects/{runtimeConditions}")
public List<MyObject> getMyObjects(@PathVariable String runtimeConditions) {
List<MyObject> list = MyRepo.findByRuntimeConditions(em, runtimeConditions);
return list;  
}
}

最新更新