【问题标题】:JPA fully dynamic and multi level criteria apiJPA 完全动态和多级标准 api
【发布时间】:2016-11-03 09:00:30
【问题描述】:

我正在尝试了解如何创建一个 JPA Critera 查询,该查询允许具有多个级别的完全动态过滤。

例如

select * 
from table 
where (
       (column1 = 'A'
        and 
       (column2 = 'B' or column3 = 'C')
      )
      or
      column3 = 'D'  

【问题讨论】:

  • 你应该尝试其他的东西,而不仅仅是“看”。目前,您的问题看起来很像“请给我完整的代码”,只是您甚至没有使用“请”这个词。

标签: java jpa


【解决方案1】:

您需要按照下面的测试创建规范。这可以是动态的。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=HelloWorldConfig.class)
public class SpecificationTest {

    @Autowired
    private AccountRepository repository;

    @Test
    public void test1() {
        final List<String> names = Arrays.asList(new String[]{"George","Max"});
        Specification<Account> specification = new Specification<Account>() {
            public Predicate toPredicate(Root<Account> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
                List<Predicate> predicates = new ArrayList<Predicate>();
                predicates.add(root.get("name").in(names).not());
                return builder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
        assertNotNull(repository);
        repository.save(makeAccount("Greg", "123456787", "01-02-01"));
        repository.save(makeAccount("George", "123456788", "01-02-02"));
        repository.save(makeAccount("Max", "123456789", "01-02-03"));

        List<Account> accounts = repository.findAll(specification);
        assertEquals(1,accounts.size());
        assertEquals("123456787",accounts.get(0).getAccountNumber());
    }

    private Account makeAccount(String name, String accountNumber, String sortCode) {
        Account account = new Account();
        account.setName(name);
        account.setAccountNumber(accountNumber);
        account.setSort(sortCode);
        return account;
    }
}

存储库的样子:

@Repository
public interface AccountRepository extends JpaRepository<Account, Long>, JpaSpecificationExecutor<Account> {
}

【讨论】:

  • 当他们说的只是 JPA 标准时,您假设他们想使用 Spring。 JPA API中没有XXXRepository,也没有“规范”
猜你喜欢
  • 1970-01-01
  • 2011-05-04
  • 2017-04-18
  • 2020-02-21
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多