복붙노트

[SQL] 어떻게 자바에서 당신 쿼리 개체 컬렉션 (기준 / SQL과 같은)?

SQL

어떻게 자바에서 당신 쿼리 개체 컬렉션 (기준 / SQL과 같은)?

당신은 몇 백 메모리 개체의 컬렉션을 가지고 쿼리와 같은 일부 SQL 또는 기준에 일치하는 객체는 반환이 목록을 조회 할 필요가 가정하자. 예를 들어, 자동차 객체의 당신은 목록이있을 수 있습니다 당신은 AZ와 시작은, 자동차 모델의 이름으로 명령하는 번호판으로, 1960 년대 만들어진 모든 차량을 반환합니다.

내가 JoSQL에 대해 알고, 사람이 사용 또는 기타 /의 자체 개발 솔루션과 경험이있다?

해결법

  1. ==============================

    1.나는 생산 응용 프로그램에서 아파치 코 몬즈 JXPath를 사용했다. 그것은 당신이 자바 객체의 그래프에 XPath 식을 적용 할 수 있습니다.

    나는 생산 응용 프로그램에서 아파치 코 몬즈 JXPath를 사용했다. 그것은 당신이 자바 객체의 그래프에 XPath 식을 적용 할 수 있습니다.

  2. ==============================

    2.다른 답변에 설명 된대로 필터링은이 작업을 수행 할 수있는 한 가지 방법입니다.

    다른 답변에 설명 된대로 필터링은이 작업을 수행 할 수있는 한 가지 방법입니다.

    필터링하지만 확장 성이 없습니다. 표면적으로 시간 복잡도는 O (N) (즉, 이미 컬렉션의 개체 수는 증가 할 경우 확장되지 않음)로 나타납니다,하지만 실제로 때문에 하나 개 이상의 테스트는 질의 시간에 따라 각 개체에 적용해야 보다 정확하게 복잡도 O (NT) t는 각각의 오브젝트에 적용 할 테스트의 수이다.

    추가 개체 및 / 또는 쿼리 증가 테스트의 숫자로, 컬렉션에 추가 될 때 성능이 저하됩니다 그래서.

    인덱싱 및 집합 이론을 사용하여이 작업을 수행하는 또 다른 방법이있다.

    객체가있는 당신이 당신의 쿼리에 연속적으로 시험을 것입니다 컬렉션에 저장 내 한 가지 방법은 필드에 빌드 인덱스이다.

    자동차 개체 및 모든 자동차 객체가 필드 색상을 가지고 당신이 컬렉션을 말해봐. 쿼리가하는 것과 동일 말 "자동차 SELECT * FROM WHERE Car.color = '블루' '. 당신은 기본적으로 같을 것이다 Car.color에 인덱스를 만들 수있다 :

    'blue' -> {Car{name=blue_car_1, color='blue'}, Car{name=blue_car_2, color='blue'}}
    'red'  -> {Car{name=red_car_1, color='red'}, Car{name=red_car_2, color='red'}}
    

    그런 다음 Car.color = '블루', 파란색 자동차의 세트가 O (1) 시간 복잡도에 검색 할 수있는 쿼리를 주어진. 쿼리에 추가 테스트가 있다면, 당신은 그것이 당신의 쿼리의 나머지 시험을 일치하는지 확인하기 위해 그 후보 세트에 각 차량을 테스트 할 수 있습니다. 후보 세트이기 때문에 가능성 전체 모음보다 훨씬 작도록, 시간 복잡도 미만 O (N)보다 (엔지니어링 의미에서, 아래에 코멘트를 참조). 성능이 추가 개체가 컬렉션에 추가 될 때, 많이 저하되지 않습니다. 하지만이 아직 완벽하지 않습니다, 읽어.

    또 다른 방법은, 내가 서 쿼리 인덱스로 참조 할 것 것입니다. 설명 : 기존의 반복 및 필터링, 컬렉션이 반복되어 모든 오브젝트은 (는) 쿼리를 일치하는지 테스트합니다. 필터링 그래서 모음으로 쿼리를 실행하는 것과 같다. 상설 쿼리 지수는 컬렉션이 여러 번 조회 할 수있다하더라도, 컬렉션의 각 개체에 대해 한 번만 컬렉션 대신 쿼리를 통해 실행되는 다른 방법으로 주위, 수 있지만 것입니다.

    상설 쿼리 지수는 개체가 컬렉션에 추가 및 제거 할 때, 컬렉션에 자동으로 등록 된 서 모든 쿼리에 대해 각 개체를 테스트 할 있도록 지능형 수집, 일종의 쿼리를 등록하는 것과 같다. 객체가 서 쿼리를 일치하면 컬렉션 추가 / 그와 일치하는 검색어 저장하는 객체에 전용 세트에서 / 그것을 제거 할 수 있습니다. 이어서, 등록 된 질의 중 O (1) 시간 복잡도에서 검색 될 수있다 매칭 개체.

    위의 CQEngine (컬렉션 쿼리 엔진)에서 가져온 정보입니다. 이것은 기본적으로 SQL과 유사한 쿼리 컬렉션을 반복하는 오버 헤드없이 사용하는 자바 컬렉션에서 객체를 검색하기위한 NoSQL에 쿼리 엔진입니다. 그것은 좀 더 위의 아이디어 플러스 중심으로 구축되어있다. 면책 조항 : 나는 저자입니다. 그것은 오픈 소스와의 중앙 받는다는. 당신이 찾을 경우 도움이 대답을 upvote에하시기 바랍니다!

  3. ==============================

    3.그래, 나는 이전 게시물 알고 있지만 기술은 일상 생활을 표시하고 대답은 시간이 변경됩니다.

    그래, 나는 이전 게시물 알고 있지만 기술은 일상 생활을 표시하고 대답은 시간이 변경됩니다.

    나는이 LambdaJ와 그것을 해결하는 좋은 문제라고 생각합니다. 당신은 여기에서 찾을 수 있습니다 : http://code.google.com/p/lambdaj/

    여기에 예제가있다 :

    ACTIVE 고객을위한 LOOK // (의 Iterable 버전)

    List<Customer> activeCustomers = new ArrayList<Customer>();  
    for (Customer customer : customers) {  
      if (customer.isActive()) {  
        activeCusomers.add(customer);  
      }  
    }  
    

    LambdaJ 버전

    List<Customer> activeCustomers = select(customers, 
                                            having(on(Customer.class).isActive()));  
    

    물론, (... 약간의 2 배의 평균) 성능에 아름다움에 미치는 영향의이 종류를 가지고,하지만 당신은 더 읽을 수있는 코드를 찾을 수 있습니까?

    그것은 많은 많은 기능을 가지고, 또 다른 예를 정렬 할 수 있습니다 :

    정렬 반복

    List<Person> sortedByAgePersons = new ArrayList<Person>(persons);
    Collections.sort(sortedByAgePersons, new Comparator<Person>() {
            public int compare(Person p1, Person p2) {
               return Integer.valueOf(p1.getAge()).compareTo(p2.getAge());
            }
    }); 
    

    람다와 정렬

    List<Person> sortedByAgePersons = sort(persons, on(Person.class).getAge()); 
    

    업데이트 : 자바 8 후에는 같은 상자 람다 표현식 밖으로 사용할 수 있습니다 :

    List<Customer> activeCustomers = customers.stream()
                                              .filter(Customer::isActive)
                                              .collect(Collectors.toList());                                      
    
  4. ==============================

    4.비교기 테마를 계속, 당신은 또한 구글 컬렉션 API를 살펴 할 수 있습니다. 특히, 그들은 Sets.filter처럼 필터링 방법에 의해 사용될 수있는 간단한 인터페이스 인 것을 비교기와 유사한 역할을 제공 술어라는 인터페이스를 갖는다. 그들은 AND 연산, 관찰 보고서 등을 할 수있는 복합 술어 구현의 모두를 포함

    비교기 테마를 계속, 당신은 또한 구글 컬렉션 API를 살펴 할 수 있습니다. 특히, 그들은 Sets.filter처럼 필터링 방법에 의해 사용될 수있는 간단한 인터페이스 인 것을 비교기와 유사한 역할을 제공 술어라는 인터페이스를 갖는다. 그들은 AND 연산, 관찰 보고서 등을 할 수있는 복합 술어 구현의 모두를 포함

    데이터 세트의 크기에 따라, 그것은 SQL 또는 외부 관계형 데이터베이스 접근보다는이 방법을 사용하는 것이 좋을 수도 있습니다.

  5. ==============================

    5.단일 콘크리트 일치해야하는 경우 클래스는 다음, 비교기를 구현 포함 된 모든 해시 필드가 독립 객체를 만들고 경기의 인덱스를 반환하는 데 사용할 수 있습니다. 당신이 컬렉션에 더 이상 (잠재적으로) 개체를 찾을하려는 경우, 당신은 (내가 그것을 사용했던 사소한 경우에 잘 작동하고있다) JoSQL 같은 라이브러리로 전환해야합니다.

    단일 콘크리트 일치해야하는 경우 클래스는 다음, 비교기를 구현 포함 된 모든 해시 필드가 독립 객체를 만들고 경기의 인덱스를 반환하는 데 사용할 수 있습니다. 당신이 컬렉션에 더 이상 (잠재적으로) 개체를 찾을하려는 경우, 당신은 (내가 그것을 사용했던 사소한 경우에 잘 작동하고있다) JoSQL 같은 라이브러리로 전환해야합니다.

    일반적으로, 나는 심지어 내 작은 응용 프로그램에 포함 더비하는 경향이 내 모델 클래스를 정의하고 빠르게 모든 것을 유지하기 위해 계획을 캐시와 최대 절전 모드 거래를 수 있도록 최대 절전 모드 주석을 사용합니다.

  6. ==============================

    6.나는 몇 년 및 입력 매개 변수로 번호판 패턴의 범위를 취하는 비교기를 사용합니다. 그런 다음 일치하는 개체를 복사 단으로 반복하여 컬렉션을합니다. 당신은 가능성이 방법으로 사용자 정의 비교기의 전체 패키지를 만드는 끝낼 것입니다.

    나는 몇 년 및 입력 매개 변수로 번호판 패턴의 범위를 취하는 비교기를 사용합니다. 그런 다음 일치하는 개체를 복사 단으로 반복하여 컬렉션을합니다. 당신은 가능성이 방법으로 사용자 정의 비교기의 전체 패키지를 만드는 끝낼 것입니다.

  7. ==============================

    7.비교기 옵션은 익명 클래스를 (그래서 같이 프로젝트에 중복 클래스를 생성하지 않기)를 사용하지만 당신이 비교의 흐름을 볼 때 결국이 지정 거의 단지 전체 컬렉션을 통해 자신을 반복처럼 특히, 나쁘지입니다 항목을 일치 정확히 조건 :

    비교기 옵션은 익명 클래스를 (그래서 같이 프로젝트에 중복 클래스를 생성하지 않기)를 사용하지만 당신이 비교의 흐름을 볼 때 결국이 지정 거의 단지 전체 컬렉션을 통해 자신을 반복처럼 특히, 나쁘지입니다 항목을 일치 정확히 조건 :

    if (Car car : cars) {
        if (1959 < car.getYear() && 1970 > car.getYear() &&
                car.getLicense().startsWith("AZ")) {
            result.add(car);
        }
    }
    

    그리고 뒷면에 ​​통증이있을 수 있습니다 정렬이 ...있다,하지만 운 좋게도 비교기를 수신 중 하나의 클래스 컬렉션과 정렬 방법을 거기에 ...

  8. from https://stackoverflow.com/questions/93417/how-do-you-query-object-collections-in-java-criteria-sql-like by cc-by-sa and MIT license