【发布时间】:2018-08-21 14:33:00
【问题描述】:
我有这样的要求:
http://localhost:4000/services/querywithdsl?min=30&max=90
我的域实体仅包含 id :
@Entity
@Data
public class ServiceNumberPorting {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(updatable = false, nullable = false)
private Long id;
}
还有我的带有谓词的休息控制器
@GetMapping(value = "/services/querywithdsl")
public ResponseEntity<List<ServiceNumberPortingMapper>>getServiceNumberPortingWithDsl(@QuerydslPredicate(root = ServiceNumberPorting.class) Predicate predicate) {
...
}
存储库:
public interface ServiceNumberPortingRepository extends JpaRepository<ServiceNumberPorting, Long>,QuerydslPredicateExecutor<ServiceNumberPorting>, QuerydslBinderCustomizer<QServiceNumberPorting>
我想用 querydsl 构建查询,像这样使用绑定
..where id>min and id< max
我找到的所有示例都是直接将查询参数映射到实体列,但在此示例中,我的实体中只有 id,我想对名称与实体列不同的传入参数值进行范围检查.
但是,由于我的域不包含 min 和 max 列,因此我无法使用自定义绑定(例如使用 QueryDslBinderCustomizer):
bindings.bind(store.city).single((path, value) -> path.endsWith(value));
如何做到这一点?
这是我浏览过的文档: spring data examples binding examples
【问题讨论】:
-
Here 是一种方法(参见“过滤器之间”)。
-
您正在使用可能存在于 Profile 实体中的 profile.heightMeters。但是我的实体中不存在 min 和 max 属性。我如何将它们与 id 进行比较?
-
但是你有
id属性 - 当你实现这个方法时,你会得到id的“介于”30 和 90 之间的过滤器,如下所示:/services/?id=30&id=90 -
@sarah 我的解决方案对你有用吗?
-
我最终使用了一些 dto 对象将请求字段映射到对象并使用可分页存储库自己创建 dsl 查询。老实说,这并不完全符合我的要求。但我感谢你们的解决方案和时间,从这些答案中学到了新的方法。
标签: java spring spring-data spring-data-jpa spring-data-rest