2014-10-22 5 views
0

내 데이터베이스에서 select 쿼리를 실행하고 json을 반환하는 서버를 작성하고 있습니다. 나는 그 작업의 대부분을 해왔지만 문자열에 nullable 컬럼을 파싱하는 것으로 막혔다.Anorm null 값

val result = SQL("SELECT * FROM Table limit 5;")().map(_.asList.map({_.toString})).toList 
val jsonResp = Json.toJson(result) 

그리고 열이 null 값 문자열 일부 (123)를 가질 수 있다면 그 생성 대신에 123 나는 match와 시도하지만 명령 작성에 실패했습니다. 어쩌면 비슷한 문제가 있었을 것입니다. 그런 종류의 대응 방법을 알고 있습니까?

편집 : 나는 패턴 매칭을 추가하여 일부 진전 :

val result = SQL(query)() 
     .map(_.asList.map(
    { 
     case Some(s) => s.toString 
     case None => "" 
     case v => v.toString 
    } 
    )).toList 

하지만 그 문제를 해결하는 좋은 방법입니다 잘 모르겠어요. 여전히 아이디어를 기다리는 중

+2

null 열 값을 빈 문자열로 렌더링하는 중입니다. 빈 문자열은 일부 데이터베이스가 그런 식으로 매핑하더라도 null과 다릅니다. 마찬가지로 null이 허용되는 정수 열은 빈 문자열로 렌더링됩니다. 이는 JSON의 유형 안전 요구 사항을 충족하지 못할 수 있습니다. –

답변

-1

데이터베이스의 선택적 항목을 json의 선택적 필드에 매핑하는 것이 가장 좋습니다. 대부분의 scala json 라이브러리는 Option 유형으로 필드를 적절하게 렌더링합니다. 또한 정수 값을 json-json에 대한 문자열로 렌더링하려는 것이 이상하게 보입니다. 정수에는 정수 유형이 완벽하게 적합합니다.

Option[Int]을이 형식으로 문자열로 변환하려는 경우 가장 명확한 방법은 아마도 o.map(_.toString).getOrElse("")입니다. 따라서 패턴 일치가 아닌 _.asList.map{_.map{_.toString}.getOrElse("")}을 작성할 수 있습니다. 필자는 결과가 정적으로 Option 유형인지 여부를 알 수있을 정도로 특정 SQL 라이브러리를 잘 모릅니다. 값이 Any 인 경우 사용자는 옵션 및 옵션 이외의 옵션을 일치시켜야합니다.

1

Anorm은 선택적 값으로 Nullable Column을 지원하고 있습니다.

여기서 원시 값의 목록으로 행을 반환합니다. 파서 API를 사용하여 값을 올바르게 추출하는 방법을 나타내는 것이 좋습니다. 예 : 속성 순서 Option[String], IntString에있는와 MyClass의 목록으로

SQL("SELECT a, b, c ...").as(get[Option[String]]("a") ~ int("b") ~ str("c) map { case a ~ b ~ c => MyClass(a, b, c) }.*) 

반환 SQL 결과.

Anorm 문서에는 다른 많은 예제가 있습니다.