2015-01-27 4 views
1

좋아 슬릭,이동적 또는 필터링 -

def(username: Option[String], petname: Option[String], favouritefood: Option[String]) 

같은 여러 옵션 인수하는 방법이 있는데 나는에 정의 된 인수의 데이터를 가져 오는 할 수있을 것입니다 동적 쿼리를 작성하려면 이쪽의 방법

이렇게 어떤 인수가 OR 연산자로 쿼리에 추가되도록 정의 되었습니까?

+0

아마, 당신은이 블로그를 사용해 볼 수 있습니다. http://davidruescas.com/2013/12/27/querying-in-slick-with-many-optional-constraints/ –

+0

다음과 같이해야한다고 생각합니다. http://stackoverflow.com/questions/26815913/ do-do-do-do-do-filter-in-slick – vitalii

+0

이미 확인되었지만 쿼리를 작성할 때 for-comprehension에 정의되어 있는지 확인할 수 없기 때문에 Optional 값에는 사용할 수 없습니다. – bgvoka

답변

5

이와 비슷한 기능이 작동합니다. 필자는 자신의 코드에서 비슷한 조각을 사용해야했으며 위의 주석에 cvogt가 제안한 것과 비슷합니다 (필자 생각).

val username = Option("") 
val petname = Option("") 
val ff:Option[String] = None 

val default = LiteralColumn(1) === LiteralColumn(1) 

yourTable.filter { it => 
    List(
     username.map(it.username === _), 
     petname.map(it.petname === _), 
     ff.map(it.ff === _) 
).collect({case Some(it) => it}).reduceLeftOption(_ || _).getOrElse(default) 
} 
+0

궁금 해서요,이게 효과가 있습니까? – tfh

+0

예, 위대한 작품입니다.) 이제는 4 개의 선택적 값과 같은 것이 필요합니다. 그리고 조건이 정의 된 조건을 포함하는 쿼리를 작성해야합니다. 'code' def (a1 : 옵션 [문자열], a2 : 옵션 [문자열], a3 : 옵션 [문자열]) 'code' a1 - 일부 ("안전") 'code' a2 - 일부 ("안전하지 않음") 'code' a3 - 없음 'code' select * from table where a1과 같은 열 또는 a2와 같은 열 어디에서 정의되지 않은 것을 무시할 것입니까? – bgvoka

+0

내 대답을 수정했습니다. 'None'에'map '하면이 값은'None'으로 유지됩니다. 결국 정의 된 값을 필터링 할 수 있습니다. – tfh

1

간단한 사용 사례는 좋지만 제한이 있습니다. 모든 옵션이 None 인 경우 목록이 비어있어 빈 목록을 줄일 수 없습니다.

술어, 연결 및 분리 (Hibernate/JPA Criteria API와 같은 비트)를 기반으로 더 복잡한 것을 필요로하는 경우, , 내 대답을 확인할 수 있습니다 Slick: create query conjunctions/disjunctions dynamically

+0

빈 목록도 처리하도록 내 대답이 업데이트되었습니다.이 특정 경우에'getOrElse'와 함께'reduceLeftOption'을 사용할 수 있습니다. – tfh