我如何使用Criteria API动态创建带有复杂基本子句的查询?

问题描述 投票:0回答:1

我正在尝试根据用户提交的搜索参数来动态查询数据库。为了实现这种动力,我不再使用标准的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-一团糟!

hibernate dynamic-sql hibernate-criteria
1个回答
0
投票

我让自己假设您的实际需求是动态查询,而不是Criteria API。如果是这种情况,则可以使用FluentJPA的dynamic queries,其旨在为动态零件提供带有“占位符”的模板式解决方案。

此外,您可以继续使用JPA Repository模式进行实施。

注意,我是FluentJPA库的维护者,但老实说,您的情况正是该库的设计目的。

© www.soinside.com 2019 - 2024. All rights reserved.