저는 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;
}
당신이 필터 속성이 내 개체를 필터링하는 모든 데이터를 유지 상상할 수 있듯이. 그러나 주어진리스트 이름에 속한 모든 엔티티 엔티티를 얻고 싶다면 코드는 어떻게 보이나요?
서브 쿼리를 사용하기 시작했지만 올바른 구문을 얻지 못했습니다. 나에게 약간의 힌트를 주시겠습니까?
의견을 보내 주셔서 감사합니다. 위키 쪽이 도움이 될 것 같습니다! 조인을 사용하는 것도 좋은 생각입니다. 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