web-dev-qa-db-ja.com

JPA:JPQLに参加する

JOINJPQLで使用する方法を知っていると思いましたが、明らかにそうではありません。誰も私を助けることができますか?

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は、GroupsとOneToManyの関係にあります。

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();

***は上記のクエリ名を表します。 fnamelnametemp内で連結されるか、List<String>戻る?

35
Thang Pham

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 { ... } 
59
axtavt