JOIN
を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
は、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();
***
は上記のクエリ名を表します。 fname
とlname
がtemp
内で連結されるか、List<String>
戻る?
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 { ... }