我正在使用Spring Data JPA并尝试向我的存储库添加查询.我试图在没有@Query注释的情况下构建查询,如:
List<Item> findByTypeAndStateOrStateAndStartDateBetween(Type type, State s, State s2, Date startDate, Date endDate);
Run Code Online (Sandbox Code Playgroud)
我的目标是构建一个这样的查询:
select * from item where type = ? and (state = ? or state = ?) and start_date between ? and ?
Run Code Online (Sandbox Code Playgroud)
我的问题是OR子句.有没有办法确保有括号?否则,逻辑是不对的.我在这里找到的例子:http: //static.springsource.org/spring-data/data-jpa/docs/1.0.0.M1/reference/html/#jpa.query-methods.query-creation
没有任何或超过1列的子句.
还有,有一种传递对象列表的方法.例如,如果我想找到具有3种状态的项目,我将不得不创建另一个查询,这种查询不能很好地扩展.
谢谢.
编辑:
我想出了如何使用@Query表示法传递状态列表.你这样做:
@Query("FROM item i WHERE i.type = ?1 AND i.state IN (?2)")
Run Code Online (Sandbox Code Playgroud)
然后你可以将列表作为第二个参数传递给方法.如果不使用@Query表示法仍然不知道如何做到这一点.
我有一个 JPA 实体,它有两个属性可以通过“OR”运算符而不是“AND”进行搜索。这些是 ledgerCode 和 Division:
Company comp = new Company();
ExampleMatcher matcher =
ExampleMatcher.matching().withStringMatcher(StringMatcher.CONTAINING)
.withIgnoreCase("name");
comp.setCountryCode(countryCode);
comp.setLedgerCode(ledgerCode);
comp.setDivision(division);
comp.setName(name);
List<Company> result = compSearchRepository.findAll(Example.of(comp, matcher));
Run Code Online (Sandbox Code Playgroud)
那么SQL结果应该是(假设所有参数不为空):
SELECT d
FROM COMPANY d
WHERE d.countryCode = country
OR d.ledgerCode = ledger
OR d.division = division
AND lower(d.name) LIKE '%name%'
Run Code Online (Sandbox Code Playgroud)
是否可以?如果是的话,怎么会这样呢?我在 Google 上找不到任何代码示例,也找不到 ExampleMatcher 类中的建议方法名称。