42

JOINin の使い方を知っていると思っていましJPQLたが、どうやらそうではありません。誰でも私を助けることができますか?

select b.fname, b.lname from Users b JOIN Groups c where c.groupName = :groupName

これは私に例外を与えます

org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing the query
Internal Exception: org.eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException

Usersとの OneToMany 関係がありGroupsます。

Users.java

@Entity
public class Users implements Serializable{

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL)
    List<Groups> groups = null;
}

Groups.java

@Entity
public class Groups implements Serializable {
    @ManyToOne
    @JoinColumn(name="USERID")
    private Users user;
}

私の2番目の質問は、このクエリが一意の結果を返すとしましょう。

String temp = (String) em.createNamedQuery("***")
    .setParameter("groupName", groupName)
    .getSingleResult();

***上記のクエリ名を表します。とを内部fnameで連結するか、バックを取得しますか?lnametempList<String>

4

1 に答える 1

69

JPQL での 1 対多リレーションの結合は次のようになります。

select b.fname, b.lname from Users b JOIN b.groups c where c.groupName = :groupName 

複数のプロパティがselect句で指定されている場合、結果は次のように返されObject[]ます。

Object[] temp = (Object[]) em.createNamedQuery("...")
    .setParameter("groupName", groupName)
    .getSingleResult(); 
String fname = (String) temp[0];
String lname = (String) temp[1];

ところで、エンティティの名前が複数形になっている理由がわかりにくいです。テーブル名を複数にしたい場合は、 を使用@Tableしてエンティティのテーブル名を明示的に指定できるため、予約語に干渉しません。

@Entity @Table(name = "Users")     
public class User implements Serializable { ... } 
于 2010-09-16T21:18:49.047 に答える