2016-11-03 3 views
0

Ich versuche zu sehen, wie ich eine JPA Critera-Abfrage erstellen würde, die für eine voll dynamische Filterung mit mehreren Ebenen ermöglicht.JPA voll dynamische und mehrstufige Kriterien api

Zum Beispiel

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

Sie wahrscheinlich etwas anderes als nur "sehen" versuchen sollte. Momentan sieht Ihre Frage ähnlich aus wie "Bitte geben Sie mir den vollständigen Code, um dies zu tun", außer dass Sie nicht einmal das Wort "Bitte" verwendet haben. – Kayaman

Antwort

0

Sie müssen unter einer Spezifikation, wie im Test erstellen. Dies kann dynamisch sein.

@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; 
    } 
} 

Wo das Repository wie folgt aussieht:

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

Sie gehen davon aus, dass Spring verwendet werden soll, wenn sie nur JPA-Kriterien angegeben haben. Es gibt kein XXXRepository in JPA API, weder "Specification" –

+0

Ja, guter Punkt, obwohl es im Frühling so viel einfacher ist. –

Verwandte Themen