1

私は休止状態とjpaが初めてです。基本的に、Person と Address の 2 つのテーブルがあります。人は多くのアドレスを持つことができます。個人と住所の間に一対多の関係があります。各人の名と住所を取得したい。

私の2つのテーブルの下に見つけてください:

ADDRESS: ADDRESSID,ADDRESS,PERSONID

PERSON:ID, FIRTSNAME,LASTNAME,PASSWORD.

以下の対応する sql の @NamedQuery を作成する方法に関する構文がわかりません。

select PERSON.FIRSTNAME, ADDRESS.ADDRESS
FROM PERSON
INNER JOIN ADDRESS
ON PERSON.id = ADDRESS.PERSONID;

アドレス エンティティ クラスを見つけてください。select ステートメントが以下のクラスにあると想定しています。

@Entity
@NamedQuery(name="getAddressWithPersonFirstName",query=" ")
@Table(name = "ADDRESS")
public class Address {

@Id
@Column(name = "ADDRESSID")
private int addressId;

@Column(name = "ADDRESS")
private String address;

@Column(name = "PERSONID")
private int personId;


@ManyToOne
@JoinColumn(name="personId")
private Person person;


public Person getPerson() {
    return person;
}

public void setPerson(Person person) {
    this.person = person;
}

public int getAddressId() {
    return addressId;
}

public void setAddressId(int addressId) {
    this.addressId = addressId;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public int getPersonId() {
    return personId;
}

public void setPersonId(int personId) {
    this.personId = personId;
}

}

私の2番目のエンティティクラス:

public class Person implements Serializable {

private static final long serialVersionUID = -1308795024262635690L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column
private String firstName;

@Column
private String lastName;

@Column
private String password;
@OneToMany(targetEntity = Address.class, mappedBy = "person")
private List<Address> address;


public List<Address> getAddress() {
    return address;
}

public void setAddress(List<Address> address) {
    this.address = address;
}

public Person() {
}

public Person(String firstName, String lastName) {
    super();
    this.firstName = firstName;
    this.lastName = lastName;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

@Override
public String toString() {

    return super.toString() + " name = " + firstName + " " + lastName
            + " id = " + id;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((firstName == null) ? 0 : firstName.hashCode());
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    result = prime * result
            + ((lastName == null) ? 0 : lastName.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Person other = (Person) obj;
    if (firstName == null) {
        if (other.firstName != null)
            return false;
    } else if (!firstName.equals(other.firstName))
        return false;
    if (id == null) {
        if (other.id != null)
            return false;
    } else if (!id.equals(other.id))
        return false;
    if (lastName == null) {
        if (other.lastName != null)
            return false;
    } else if (!lastName.equals(other.lastName))
        return false;
    return true;
}

}

クエリを実行するメソッドを見つけてください:

    public List<Address> getAddressByPersonFirstName() {

    TypedQuery<Address> query = entityManager.createNamedQuery(
            "getAddressWithPersonFirstName", Address.class);
    List<Address> results = query.getResultList();
    return results;

}

上記のように、私の 2 つの主な問題は、@NamedQuery を作成してすべての住所を人名で検索する方法です。住所と人名を返すため、上記の方法が正しいかどうかはわかりませんが、上記の方法はオブジェクト Address を返します。 .:(

どんな助けでも大歓迎です。もう一度感謝します

4

1 に答える 1

1

したがって、最初にやりたいことは、 Person クラスを再確認することです。アドレス クラスには @Table(name="ADDRESS") と @Entity がありますが、Person クラスにはこれらが表示されません。Person クラスが PERSON テーブルにマップされていることを確認します。

あなたが説明していることに基づいて、あなたがやりたいことをするために名前付きクエリさえ必要ないと思います。データベース内のすべての住所を選択し、その住所に関連付けられている人物の名前を取得したいようです。@ManyToOne 結合を使用して Address を Person クラスにマップしました。

したがって、最初のステップはすべてのアドレスを取得することです。これを行うにはいくつかの方法があります。試すことができます。

Query query = entityManager.createQuery("select a from Address a");
List<Address> addresses = (List<Address>) query.getResultList();

これにより、データベース内のすべてのアドレスが取得されます。ファースト ネームをその住所と一緒に使用する場合は、リストから個々の住所を引き出します。

address.getPerson().getFirstName();

ここで、特定の名前に対してこれを行う名前付きクエリを作成したいとします。人物の名が「Bob」であるすべての住所を検索するとします。

@NamedQueries({
    @NamedQuery(name="getAddressWithPersonFirstName", query="select a from Address a inner join Person p 
            where p.firstName=:firstName")
})
@Entity
@Table(name = "ADDRESS")
public class Address {

次に、名前付きクエリを呼び出します。

Query query = entityManager.createNamedQuery("getAddressWithPersonFirstName")
query.setParameter(0, "Bob");
return (List<Address>) query.list();
于 2013-01-29T13:23:30.330 に答える