31

Adminを拡張するオブジェクトを取得しましたUser。デフォルトでは、両方のオブジェクトがUser_私の Derby データベースのテーブルにあります (からのフィールドが含まれていますAdmin)。通常、次のUserように選択します。

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root user= query.from(User.class);
Predicate predicateId = cb.equal(category.get("id"), id);
query.select(user).where(predicateId);
return em.createQuery(query).getSingleResult();

ただし、クエリが複雑なため、次のようなネイティブ クエリを使用しています。

Query query = em.createNativeQuery("SELECT USER.* FROM USER_ AS USER WHERE ID = ?");
query.setParameter(1, id);
return (User) query.getSingleResult();

これはキャスト例外をスローしますが。これは のフィールドによるものだと思いますAdmin

User私の質問は、最初の例と同じ結果を持つネイティブクエリを使用してどのように選択できますか(JPQLクエリが返すの@LOBと同じ値を含む)?@ManyToOne

4

5 に答える 5

65

次のいずれかの方法を試してください。

  • メソッドの使用createNativeQuery(sqlString, resultClass)

    EntityManager.createNativeQuery()ネイティブ クエリは、 APIを使用して動的に定義することもできます。

    String sql = "SELECT USER.* FROM USER_ AS USER WHERE ID = ?";
    
    Query query = em.createNativeQuery(sql, User.class);
    query.setParameter(1, id);
    User user = (User) query.getSingleResult();
    
  • 注釈の使用@NamedNativeQuery

    ネイティブ クエリは@NamedNativeQuery@NamedNativeQueries 注釈または<named-native-query>XML 要素によって定義されます。

    @NamedNativeQuery(
        name="complexQuery",
        query="SELECT USER.* FROM USER_ AS USER WHERE ID = ?",
        resultClass=User.class
    )
    public class User { ... }
    
    Query query = em.createNamedQuery("complexQuery", User.class);
    query.setParameter(1, id);
    User user = (User) query.getSingleResult();
    

詳細については、優れた公開書籍Java Persistence ( PDFで入手可能) を参照してください。

────────
注意: の使用に関しては、 JPAで決して使用すべきではない理由をgetSingleResult()参照してください。getSingleResult()

于 2013-07-17T20:11:12.353 に答える
5

ネイティブ クエリが結合に基づいている場合、その場合、結果をオブジェクトのリストとして取得して処理できます。

簡単な例を 1 つ。

@Autowired
EntityManager em;

    String nativeQuery = "select name,age from users where id=?";   
    Query query = em.createNativeQuery(nativeQuery);
    query.setParameter(1,id);

    List<Object[]> list = query.getResultList();

    for(Object[] q1 : list){

        String name = q1[0].toString();
        //..
        //do something more on 
     }
于 2019-04-13T17:30:24.337 に答える