2014-01-26 2 views
2

아약스 요청에 회신에 약간의 문제가 있습니다. 처음에는 봄 부팅 MVC을 기반으로 가장 단순한 편안한 서비스를 제공합니다.봄 mvc 편안한 - 잘못된 json 응답 형식

모델 :

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.jpa.repository.Query; 
import org.springframework.data.repository.query.Param; 

import java.util.*; 

public interface TetsModelDAO extends JpaRepository<Samples, Long> 
{ 
    @Query("SELECT s FROM TestModel s WHERE LOWER(s.name) LIKE LOWER(:entry) ORDER BY s.name") 
    List<TestModel> fetchByNameEntry(@Param("entry") String entry); 
} 

컨트롤러 :

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 
import java.util.List; 

@RestController 
@RequestMapping("/") 
public class TestController 
{ 
    @Autowired 
    private TetsModelDAO testmodel; 

    @RequestMapping("/name") 
    public List<TestModel> getDatasetsByNameEntry(@RequestParam("entry") String entry) 
    { 
     return testmodel.fetchByNameEntry("%"+entry+"%"); 
    } 
} 

클라이언트 측 Ajax 요청 :

$.ajax(
{ 
    url : "/name?entry=", //get all records 
    method: "GET" 
}) 
,536 모델

import javax.persistence.*; 
import java.util.*; 

@Entity 
@Table(name = "testmodel") 
public class TestModel 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)//Postgresql sequence generator 
    private long id; 

    @Column(name = "name") 
    private String name; 

    @Column(name = "content") 
    private String content; 


    //Constructor 
    public TestModel() 
    { 
    } 

    //Id getter 
    public long getId() 
    { 
     return this.id; 
    } 

    //Name getter-setter 
    public String getName() 
    { 
     return this.name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    //Content getter-setter 
    public String getContent() 
    { 
     return this.content; 
    } 

    public void setContent(String content) 
    { 
     this.content = content; 
    } 
} 

DAO

이 예는 완벽하게 작동 - 캐릭터 라인 응답은 STANDART JSON과 같은 구조 같습니다 그러나

{"id":"1", "name":"John", "content":"blablabla1"} 
{"id":"2", "name":"Sam", "content":"blablabla2"} 
{"id":"3", "name":"Ken", "content":"blablabla3"} 

, 내가 (말 만 ID이름 필드를 가져 명시 적으로 JPQL 쿼리 fileds를 정의하는 시도), 나는 답장을 잘못 받는다. 수정 된 쿼리 (변경하지 않고 다른 코드)와

DAO :

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.jpa.repository.Query; 
import org.springframework.data.repository.query.Param; 
import java.util.*; 

public interface TetsModelDAO extends JpaRepository<Samples, Long> 
{ 
    @Query("SELECT s.id, s.name FROM TestModel s WHERE LOWER(s.name) LIKE LOWER(:entry) ORDER BY s.name") 
    List<TestModel> fetchByNameEntry(@Param("entry") String entry); 
} 

이 경우 응답에서는 다음과 같습니다

1, John, 2, Sam, 3, Ken 

방법 "도우미 클래스"를 작성하지 않고 (적절하게이 문제를 해결하려면)?

답변

2

당신은 저장소에서 직접 DTO를 반환 할 수 있습니다 TestDto에만 필요 필드가 포함

public interface TetsModelDAO extends JpaRepository<Samples, Long> 
{ 
    @Query("SELECT new mypackage.TestDto(s.id, s.name) FROM TestModel s WHERE LOWER(s.name) LIKE LOWER(:entry) ORDER BY s.name") 
    List<TestDto> fetchByNameEntry(@Param("entry") String entry); 
} 

을 :

package mypackage; 

public class TestDto { 
    private final long id; 
    private final String name; 

    public TestDto(long id, String name) { 
    this.id = id; 
    this.name = name; 
    } 

    public long getId() { 
    return id; 
    } 

    public String getName() { 
    return name; 
    } 
} 
+0

org.hibernate.hql.internal.ast.QuerySyntaxException : 클래스 [TestDto]를 찾을 수 없습니다 [새 TestDto (s.id, s.name)를 선택하십시오. TestModel에서 WHERE LOWER (s.name) LIKE LOWER (: entry)이게 뭐야? TestDa와 동일한 패키지의 클래스 TestDto – gorill

+0

@Query에서 클래스의 전체 이름 (패키지 포함)을 지정해야합니다. - 그냥 내 대답에 추가했습니다. –

+0

대단히 감사합니다.))))))) – gorill

0

조회에 TestModel의 인스턴스를 반환하지 않습니다. 객체의 배열 (즉, List<Object[]>)을 반환하며, 각 배열에는 ID와 발견 된 이름이 포함됩니다. TestModel. 올바른 쿼리 당신은 더 나은 귀하의 DAO 쿼리 그들이 무엇을해야 반환하는지 확인하기 위해 자동화 된 테스트를 구현하는 것

SELECT s FROM TestModel s WHERE LOWER(s.name) LIKE LOWER(:entry) ORDER BY s.name 

입니다.