最初の解決策: 定数を使用して、それらを 1 か所にハードコーディングします。ただし、コードが読みにくくなり、定数に間違った列名が含まれるリスクが依然としてあるため、この解決策はひどいものです。
2 番目の解決策: そのままにして、クエリの単体テストを行います。コードは読みやすくなり、単体テストで名前が間違っていないことが確認されます。
3 番目の解決策: JPA API を使用し、自動的に生成されたメタモデルで JPA2 基準 API を使用します。クエリは次のようになります。
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items);
cq.where( cb.equal(itemNode.get(Item_.id), 5 ) ).distinct(true);
ここOrder_
で、 およびItem_
は、すべての列の属性Order
と およびItem
エンティティの関連付けをそれぞれ保持する、自動生成されたメタモデル クラスです。私見ですが、JPA2基準APIは直観的でなく、使いにくいAPIであり、コードを読みやすくしないことに注意してください。
ぜひ、条件クエリの代わりに、できる限り HQL/JPQL を使用してください。条件クエリは、さまざまなオプションの条件に基づいてクエリを動的に生成する必要がある場合、または複雑で類似したクエリが多数あり、共通部分を再利用できる場合に役立ちます。しかし、ほとんどの場合、HQL の方がはるかに読みやすいです。とにかく、クエリの単体テストを行う必要があります。したがって、これらのテストでは、プロパティ名が正しいことを確認します。