2017-12-27 55 views
1

Spring 웹 애플리케이션에서 JPA/Hibernate로 액세스되는 관계형 DB가 있습니다. 관계형 결과가 JSON 객체로 변환 될 필요가있는 곳에 많은 Ajax 쿼리가 있습니다. 관계형 JPA 쿼리에서 아래와 같이 변환 할 수있는 간단한 솔루션이 있습니까?관계형 DB JPA/Hibernate 쿼리에서 JSON 객체 만들기

enter image description here

결과

당신은 관계형 DB는 날짜 StartTime 또는 EndTime (행 1 대 2) 중 하나입니다 개체 당 2 행으로 돌아 오면이 예제에서 볼 수
[ 
    { id: event-..782, color: rgba(14,48,71,0.6), startTime : 2017-12-27 00:05, endTime: 2017-12-27 00:25 }, 
    { id: event-..801, color: rgba(249,115,0,0.6), startTime: 2017-12-27 00:30, endTime: 2017-12-27 00:45 }, 
    { id: event-..776, color: rgba(255,0,0,0.99), startTime: 2017-12-27 00:00, endTime: 2017-12-27 00:05 }, 
    { id: event-..838, color: rgba(255,0,0,0.99), startTime: 2017-12-27 00:25, endTime: 2017-12-27 00:30 } 
] 

. 여기서는 2 행에서 2 열로 결합되어야합니다. 이러한 테이블 데이터를 JSON으로 어떻게 든 마사지 할 필요가있는 예제가 많이 있습니다. 내가 볼

솔루션은 사용자 정의 객체로/프로젝트 결과를 마사지 마법을 수행 JPA 측면에서

  • 이다, 그러나 이것은 매우 고통스러운 것입니다. 가끔 네이티브 SQL 해킹이 가능할 수도 있고 그렇지 않은 경우도 있습니다. 이것은 나에게 불일치하고 불확실한 것처럼 보입니다.
  • "일반"JPA 엔티티를 얻은 후에 javax.json 또는 GSON과 같은 도구를 사용하여 수동 JSON을 사용하지만 사람들은 이것이 잘못된 접근이라고 말합니다. 그러나 내가이 경로를 선택하더라도 JPA에서 사용자 정의 결과를 얻는 POJO (실제 도메인 엔티티를 얻지 못할 것이기 때문에)와 실제 최종 JSON 표현에 대해 다른 POJO가 필요합니다.

사람들이이 문제를 어떻게 처리합니까? 그들은 JPA/Hibernate를 정말로 조정할 수 있습니까? GSON을 사용하여 수작업 인구를 사용합니까?

참고 우리는 DB로 PostgreSQL 10을 사용하고 있습니다.

+0

구체적인 문제는 분명하지 않습니다. db가 2 개의 결과를 반환한다는 것은 무엇을 의미합니까? 코드를 보여주세요. 어쨌든, db 객체를 표현하고 질의하는 JPA, 객체를 json 표현으로 변환하는 json 라이브러리 등 목적에 맞는 도구를 사용하십시오. BTW, 왜 rgba 색상을 표현하기 위해 정수를 사용하지 않습니까? – perissf

+0

이 경우 오브젝트 정보 당 2 개의 행 항목이 있습니다. 행 1은 StartTime (Date val)이고 Row 2는 EndTime (Date val)입니다. –

+0

당신의 태그는 당신이 봄을 사용하고 있다고 말합니다. 스프링 MVC는 Jackson을 사용하여 JSON을 자동 생성합니다. https://spring.io/guides/gs/rest-service/ –

답변

0

당신은 SqlResultSetMapping, 매핑 된 엔티티 또는 @NamedNativeQuery을 사용할 수, 쿼리 이런 식으로 뭔가해야 원하는 형식으로 정확하게 결과를 얻고 JSON 개체에 직접 매핑 (당신의 RDBMS에 따라 다름) :

Select distinct id_char, color, date starTime, 
(Select date from table t2 where t2.id_char=t1.id_cgar and t2.id_int=2) as endTime 
From table t1 where t1.id_int=1 

또한 간단한 POJO 클래스를 사용하여 원하는 형식으로 변환 그대로 결과를 얻을 귀하의 응용 프로그램 계층에서 할 수 있습니다.

+0

팁 # 2의 경우 For 루프를 사용하여 순차적으로 각 행을 스캔하고 POJO를 빌드하는 것이 좋습니다. 즉, 동일한 이벤트에 대해 변경 사항을 확인한 다음 수동으로 필드를 설정합니까? 나는 이것이 끔찍하고 수동적 인 처리가 피해야한다는 불만을 가지고 있기 때문에. –

+0

아니요, 물론 이러합니다. for-loops를 사용하고 응용 프로그램 계층에서 DB에서 얻은 전체 결과를 처리하는 이러한 작업은 응용 프로그램에 사용되는 메모리에 부정적인 영향을 줄 수 있으며 성능에 영향을 미칠 수 있습니다. – jfun