QA@IT

WildFlyのhibernateを使用したJPQLのSELECT文について

2661 PV

前提
下記の3つのクラスがあります、必要だと思われるところだけ抽出しています
Order.class
@NamedQueries ({
@NamedQuery(name=Order.Order_TEST, query="select c from Order c where c.custom.id=:customId)
})
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Custom custom;

Custom.class
@Id
private String id;

OrderManager.class
TypedQuery query = em.createNamedQuery(Order.Order_TEST, Order.class);
query.setParameter("customId", id);
return query.getResultList();

困っていること
JPQLでのselect c from Order c where c.custom.id=:customIdがエラーになります
エラー内容はidがLongでないとのことです。
想定している内容はCustomのidなのでStringの項目を想定しています。
Stringでパラメータを渡しているのでエラーになっています。

実際発行されたhibernateのSQL文はOrderのidをよんでしまっています。
Customのidをよんでほしいのですが、何かいい方法はないでしょうか?
宜しくお願いします。

回答

あまり自信ないですが、JPQLの書き方は

select c from Order c join c.custom d where d.id = :customId

のような気がします。

参照
https://docs.oracle.com/javaee/7/tutorial/persistence-querylanguage004.htm#BNBTQ

編集 履歴 (0)
  • 回答ありがとうございます。
    上記方法試したのですが、SQLエラーになってしまいました。
    -
  • OneToOneのアノテーションを付けたあとで、こちらのSQLも動作しました。 -
  • 了解です。報告して頂いてありがとうございます。
    -

自己解決しました。

Order.class
@NamedQueries ({
@NamedQuery(name=Order.Order_TEST, query="select c from Order c where c.custom.id=:customId)
})
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Custom custom;

原因
@OneToOne
private Custom custom;

OneToOneの記述がないのが原因でした。
お騒がせしました。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。