2013-06-23 1 views
0

저는 JPA (eclipselink 기반)를 처음 사용하므로 저와 제 질문에 인내심을 가지고 있습니다. JPA는 간단한 DB 문을 처리하는 우아한 방법입니다. 그러나 이제 좀 더 복잡한 작업을하고 싶습니다.
내가 원하는 것을 설명해 드리겠습니다 : 나는 사람의 데이터를 담고있는 테이블을 가지고있다. 다른 테이블에서 주소 목록을 유지하고 싶습니다. 한 사람의 방식으로 여러 adresslists와 하나의 주소 목록에 여러 명을 유지할 수 있기 때문에 ref-table jo가이 모음집에 가입해야합니다.CriteriaBuilder를 사용하여 refTable에서 참조하는 엔티티를 선택하십시오.

그래서 내 DB 테이블은 다음과 같이 :
SQL (DDL 구문을 정확하지만 이해하는 데 도움이되지!) --without 제약 등 고마웠다 사람이 사람의 데이터가 a_person CREATE TABLE을 유지
( OID 일련 기본 키 NULL NOT, vorname 문자) (50 변화, nachname 문자 다양한 (50) NULL NOT - )

--the adresslist is quite simple: just a name of the list is storred 
CREATE TABLE a_adressliste (
(
    oid serial PrimaryKey NOT NULL, 
    label character varying(25) NOT NULL 
    --<more collumns here> 
) 

    --the table refering the list the the containing persons 
CREATE TABLE a_listen_person 
(
    fk_adressliste bigint PrimaryKey NOT NULL, --ref to a_person.oid 
    fk_person bigint PrimaryKey NOT NULL,  --ref to a_adressliste.oid 
) 

이 구조는 다음과 같은 SQL 문을 사용하여 ADRESS 목록을 선택하기 쉽게 DB를 몇 가지 데이터를 갖는 : 이제

select * from a_person p where p.oid in (
    select 
     lp.fk_person 
    from 
     a_listen_person lp, a_adresssliste al 
    where 
     lp.fk_adressliste = al.oid AND al.label = {LISTE_LABEL} 
) 

을의 DB 내에서 구조 그래도 따르면, 내가있어 해당 자바 POJO의에 이 테이블은

public class Person implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "oid") 
    private Integer oid; 
    private String vornmae; 
    private String nachname; 

    //getter; setter and the other missing stuff... 
} 

public class Adressliste implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "oid") 
    private Integer oid; 

    private String label; 
} 

public class ListenPerson implements Serializable { 
    @EmbeddedId 
    private ListenPersonPK listenPerson;//build from Person.oid and Adressliste.oid 
    private Person person; 
    private Adressliste adresssliste; 

    //getter; setter and the other missing stuff... 
} 

가 지금은 JAV의 finder 메소드를 작성했습니다

JAVA (나는 조금 짧은 내 코드를 유지하기 위해 주석을 생략했습니다) A 내가 CriteriaBuilder를 사용하여 Person POJO에 따라 여러 속성으로 엔티티를 필터링합니다. 하지만 주어진 목록 이름에 따라 Person을 선택하지는 못했습니다. 으로 지금 내 방법은 다음과 같습니다

public TypedQuery<Person> prepareQueryFiltered(Filter filter) { 
    TypedQuery<Person> retVal; 
    EntityManager em = this.getEntityManager(); 

    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<Person> query = builder.createQuery(Person.class); 
    Root<Person> cust = query.from(Person.class); 
    query.select(cust); 

    List<Predicate> predicateList = new ArrayList<Predicate>(); 

    Predicate predicate; 

    if (null != filter.getVorname()) { 
     predicate = builder.like(
       builder.lower(cust.<String>get("vorname")), 
       "%" + filter.getVorname().toLowerCase() + "%"); 
     predicateList.add(predicate); 
    } 
    if (null != filter.getNachname()) { 
     predicate = builder.like(
       builder.lower(cust.<String>get("nachname")), 
       "%" + filter.getNachname().toLowerCase() + "%"); 
     predicateList.add(predicate); 
    } 
    //some more filtered attributes ... 

    query.where(predicateList.toArray(new Predicate[predicateList.size()])); 

    retVal = em.createQuery(query); 

    return retVal; 
} 

당신이 필터 속성이 내 개체를 필터링하는 모든 데이터를 유지 상상할 수 있듯이. 그러나 주어진리스트 이름에 속한 모든 엔티티 엔티티를 얻고 싶다면 코드는 어떻게 보이나요?
서브 쿼리를 사용하기 시작했지만 올바른 구문을 얻지 못했습니다. 나에게 약간의 힌트를 주시겠습니까?

[기준 API 참조에서 서브 쿼리의 예

답변

0

, 또한

http://en.wikibooks.org/wiki/Java_Persistence/Criteria#Subquery

, 난 당신이 간단한 일을해야 조인 하위 쿼리를 필요가 있다고 생각하지 않습니다.

Select p from Person p, ListenPerson l where l.person = p and l.adresssliste.label = :label 
+0

의견을 보내 주셔서 감사합니다. 위키 쪽이 도움이 될 것 같습니다! 조인을 사용하는 것도 좋은 생각입니다. SQL에서는 p_oid p, a_listen_person lp, a_adresssliste al에서 p.oid = lp.fk_person 및 lp.fk_adressliste = al.oid AND al.label = {LISTE_LABEL}'을 사용하는 것이 좋습니다. -이 명령문은 또한 원하는 엔티티를 제공합니다. * 필터 속성으로'{LISTE_LABEL} '만 주어진 경우 필터링 된 목록에서 찾으려는 엔티티입니다. 쿼리를 작성하는 Java 코드 저장 형식을 작성하고 싶습니다. 이게 내 목표에 더 좋은 방법이라고 생각하지 않니? – user2513613

관련 문제