2011-01-19 3 views
0

쉽게 해결할 수있는 문제가 있지만 솔루션을 찾는 데 어려움이 있습니다. 데이터 테이블에 표시 할 데이터베이스가 있습니다. 그러나 현재 행에 대한 자세한 정보를 얻는 추가 열이 필요합니다. 예를 들어 - 데이터베이스에는 ID 번호를 가진 사람들이 있습니다. 필요한 것은 이름, 성, ID (모든 데이터베이스 열)를 표시하는 것이지만 다른 REST 웹 서비스에있는 주소를 표시하고 ID (데이터베이스에서)를 보내야합니다.JSF - 데이터베이스 행 값을 사용하여 데이터 테이블에 추가 열을 생성하는 방법

- 내 데이터베이스는 3 열이 있습니다 : 나는 명확하게 설명했지만 단지의 경우 내가 지적 희망의 이름, 라스의 이름, ID 번호 -I 주소 내 데이터 테이블에 4 열을 추가 할 필요가 - 주소를 얻으려면 나머지 웹 서비스에 ID 번호를 보내야합니다.

지금까지는 모든 데이터베이스 요소를 목록이나 일부 컨테이너에 추가 한 다음 빈 내부에서 사용할 수있는 유일한 해결책이었습니다. 그러나 그것은 데이터베이스가 매우 크기 때문에 받아 들일 수없는 것입니다. 더 간단한 방법이 있어야하지만 적절한 결과를 얻으려면 Google에 적절한 질문을 할 수 없습니다.> 어떤 조언을 해줄 수 있습니까?

답변

1

그래서 기본적으로 데이터베이스에 대한 쿼리 결과와 웹 서비스 간의 조인을 수행하면됩니다.

물론 "join"을 수행하기 위해 일부 bean에서 전체 DB를로드 할 필요는 없습니다. 단지 backing bean의 화면에 표시하고자하는 데이터를로드하고 각 행의 주소를로드 한 다음 결과를 데이터 테이블에 바인드합니다.

이런 식으로 뭔가 :

@ManagedBean 
@ViewScoped 
public class MyBean { 

    @EJB 
    private someDataService; 

    @EJB 
    private someWebService; 

    List<Person> persons; 
    Map<Long, String> addresses; 

    @PostConstruct 
    public void retrieveData() { 
     persons = someDataService.getByID(someID); 
     for (Person person : persons) { 
      addresses.put(person.getID(), someWebService.getByID(person.getID)); 
     } 
    } 

    // getters here 
} 

그리고 Facelet :

<h:dataTable value="#{myBean.persons}" var="person"> 
    <h:column> 
     #{person.name} 
    </h:column> 
    <h:column> 
     #{person.lastName} 
    </h:column> 
    <h:column> 
     #{myBean.addresses[person.ID]}  
    </h:column>    
</h:dataTable> 

할 몇 가지 선택이 있습니다. 또한 하나의 서비스 안에서 참여할 수 있으며 주소가 포함 된 일부 유형을 반환하게 할 수 있습니다. 래퍼 또는 데코레이터를 만들 수도 있습니다.

웹 서비스가 가져온 각 주소에 대해 별도의 호출을 요구하는 대신 ID 목록을 처리 할 수 ​​있다면 더 효율적입니다. 로컬 캐싱 등을 원할 수도 있지만 그 세부 사항은 사용자의 책임입니다.)

+0

응답을 보내 주셔서 감사합니다. 게시 한 코드에 의심의 여지가 있습니다. 명 = someDataService.getByID (someID); 어떻게 작동합니까? 전체 데이터베이스를 사람 목록에로드합니까? 그렇다면 그것은 sth입니다. 나는 피하려고 애썼다. 그렇지 않다면 'someID'인수를 계류중인 데이터베이스의 '현재'행에 어떻게 연결할 수 있습니까? –

+0

@PostConstruct 메서드에는 현재 행에 대한 개념이 없지만 여기에는 전체 DB가 사용되지 않습니다. 이 호출은 단일 화면에 표시하려는 데이터에 대해 단일 쿼리를 수행하는 것입니다. 최대 항목 수는 사용자에게 달려 있지만 일반적인 디스플레이는 25 ~ 100 행입니다. @PostContruct는 한 번만 실행되고 100 명을 말한 다음 렌더링하면 100 명이 렌더링됩니다. –

+0

Ok atjan, 나는 적어도 그림을 얻는다 고 생각합니다.> 나는 당신의 접근 방식을 시도 할 것이지만 불행히도 DB가 추락 한 이후에 주말 전에는 아닙니다. 또한 연결을 위해 최대 절전 모드가 필요할 수도 있습니다. –

관련 문제