2012-06-06 2 views
0

나는 명명 된 쿼리를 사용하여 JPA 제공자로서 최대 절전 모드를 사용하고 있으며 결과를 언어에 따라 고유하게 정렬 할 수 있는지 궁금해하고 있습니다. 기본 데이터베이스는 일부 Oracle R10입니다.JPA/SQL의 언어 별 ORDER BY

영어 이름 열과 라틴어 이름 열이있는 표 동물 (프랑스, 독일어, 이탈리아어, 스페인어)이 있고 언어 중 하나에 따라 정렬해야한다고 가정 해 봅시다.

은 정렬 된 목록은 당신이 등이

SELECT animal from Animal animal order by animal.name_EN; 
SELECT animal from Animal animal order by animal.name_LA; 
SELECT animal from Animal animal order by animal.name_FR; 

와 같은 다른 선택 문을 사용할 수 얻으려면. 또는 내가 한 것은 비교자를 작성하여 언어에 따라 결과 목록을 정렬하는 것입니다.

더 좋은 방법이 있습니까?

+0

쿼리가 될 수있는만큼 우아한. 그러나 데이터베이스 디자인은 그렇지 않습니다. 더 우아한 데이터베이스 디자인입니까? –

+0

ORDER BY name_ : lang과 같은 것이 좋습니다. 매개 변수에 따라 결과를 기본적으로 정렬하는 i18n 데이터베이스 쿼리입니다. – mana

답변

2

대신 OS는 테이블의 각 언어에 대한 열을 추가, 당신은 정상화 및 추가 테이블 ANIMAL_TRANSLATION이 있어야합니다

public class Animal { 
    /** 
    * The translations, indexed by language 
    */ 
    @OneToMany(mappedBy = "animal") 
    @MapKey(name = "language") 
    private Map<String, AnimalTranslation> translations; 

    ... 
} 

public class AnimalTranslation { 
    @ManyToOne 
    @JoinColumn(name = "ANIMAL_ID") 
    private Animal animal; 

    ... 
} 
:

ID : technical ID, auto incremented 
ANIMAL_ID: foreign key to the ANIMAL table 
LANGUAGE: the language of this translation 
NAME: the translated name 

당신은 다음 동물과 AnimalTranslation 사이 OneToMany의 관계를 것을

그리고 당신의 쿼리는 예를 들어, 수 :

select translation from AnimalTranslation translation 
inner join fetch transalation.animal animal 
where translation.language = :language 
order by translation.name; 

그리고 이것은 동물과 함께 주어진 언어에 대한 모든 동물 번역을 검색 할 것입니다.

더 복잡한 보일 수도 있지만, 그것은 또한 더 표준화, 그리고 스키마 및 엔티티 새로운 언어로 제공마다 변경하도록 강요하지 않습니다.

+0

이것은 좋은 해결책입니다. 이 영감을 가져 주셔서 감사합니다. – mana

관련 문제