2013-11-20 3 views
0

У меня есть к столуJPA: присоединиться к колонке на основе некоторого условия

table A : personID, name, someOtherColumns (personID is primarykey) 
table B: personAliasID, personID, personAias, someOtherColumns (personAliasID is primary key) 

один человек может иметь Muliple персоналии. Что я хочу сделать, так это получить таблицу A на основе personID и определенного лица. Объект A также должен иметь поле B b экземпляра (как показано ниже), чтобы я мог получить доступ к информации в объекте B для этого человека.

вот мой код

@Entity 
    @Table(name="A") 
    public class A implement Serializable { 
     ... 
     ... 
     //find the column in B where personAlias="someName"  
     @PrimaryKeyJoinColumn(name="personID", referencedColumnName = "personID" 
      private B b; 

    } 

Как я могу это сделать?

ответ

0

Представлять объединения вы ищете вы можете сделать следующее:

... 
public class A implements Serializable 
    @Id 
    @GeneratedValue(strategy = ...) // assuming you are generating values for personId 
    private long personId; 
... 

и

... 
public class B implements Serializable 
... 
    @JoinColumn(name="personId", nullable=false) 
    @ManyToOne 
    private A person; 

Затем, чтобы создать такой объект в вашем коде вы можете сделать что-то вроде этого:

A a = ... // create person object for person with appropriate personID 
B b = ... 
b.setPerson(a); 
b.setPersonAlias(alias); 

Но для простого запроса на основе этих таблиц вы также можете создать @NamedQuery на A, чтобы выполнить запрос, который вы хотите. Вот как вы можете получить объект A для personID с переменной personAlias:

например

... 
@NamedQuery(name = "A.personByAlias", query = "select a from A a, B b" 
      + " where a.personId = b.personId and b.personAlias = :personAlias") 
public class A implements Serializable 
... 

Тогда звоните:

Query query = em.createNamedQuery("A.personByAlias"); 
    query.setParameter("personAlias", id); 
    List<A> result = query.getResultList(); 
+0

Спасибо. с этим namedquery, я могу получить объект a. как я могу получить доступ к этому псевдониму и другой информации, хранящейся в таблице B? – neo

+0

Вы можете использовать 'em.find (B.class, pkey)' см. Http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#find(java.lang.Class, java .lang.Object) – cmd

+1

Или класс A может ссылаться на B с помощью OneToMany (mappedby = "person"), делая отношения двунаправленными. Вы использовали бы коллекцию в A для этого, так как она может содержать много B или псевдонимов. – Chris

Смежные вопросы