我正在尝试根据用户提交的搜索参数来动态查询数据库。为了实现这种动力,我不再使用标准的JPA / Crud存储库。但是,基本查询非常复杂。假设HOUSE和WINDOW都是实体类,
select h.*
from HOUSE h join WINDOW w on h.id = w.house_id
where ((w.status in ('OPEN', 'HALF OPEN')) or
(w.status = 'CLOSED' and w.condition = 'GOOD') or
(w.status = 'CLOSED' and w.condition is null and w.refurbished_date between NOW() - INTERVAL 365 DAY AND NOW()) or
(w.status = 'CLOSED' and w.manufacture_date <> '1960-01-01 00:00:00' and w.refurbished_date between NOW() - INTERVAL 365 DAY AND NOW()))
((不是真正的查询,但足以很好地说明一个真实的查询)
此查询不变。我只需要根据用户提供的内容在其后附加“ AND”子句即可。
我很难决定如何解决这个问题。我没有在网上找到任何建议可以将上述SQL转换为Criteria API逻辑的内容。
编辑:到目前为止,我已经尝试过使用纯Java动态创建查询并通过Session执行它。但是,返回的结果不会自动映射到我的实体类(它们是Object类型的),并且我不得不重写ResultSetTransformer-一团糟!
我让自己假设您的实际需求是动态查询,而不是Criteria API。如果是这种情况,则可以使用FluentJPA的dynamic queries,其旨在为动态零件提供带有“占位符”的模板式解决方案。
此外,您可以继续使用JPA Repository模式进行实施。
注意,我是FluentJPA库的维护者,但老实说,您的情况正是该库的设计目的。