2016-09-09 11 views
0

一意の列に基づいて行を選択する方法。 私のテーブルには、Idが自動的に生成されます。テーブルスキーマ内で一意の行を選択するために電話番号を使用しています。HQL選択クエリ

例:ここでは

Id Phone  Name 
1  2209897 abc 
2  5436567 def 

、Idは主キーです。電話番号は です。

私はログインするために電話を使用しています。 リストを生成するのではなく、出力として単一の行を作成します。

@Repository 
public class CustomerDetailsDAOImpl implements CustomerDetailsDAO { 

@Autowired 
SessionFactory sessionFactory; 

@Override 
@Transactional 
public List<CustomerDetails> getCustomer(String customerPhone) { 
    Session session = sessionFactory.openSession(); 

    Query q = session.createQuery("from CustomerDetails where customerPhone =:p"); 
    q.setParameter("p", customerPhone); 

    List<CustomerDetails> customer = q.getResultList(); 
    session.close(); 
    return customer; 

} 
+0

ちょうど 'CustomerDetails顧客= q.getResultList()を使用し、' List'を使用しないでくださいを; '、'場合:あなたは意志その後、以上の1行を返しますp' 'ResultSizeException'を取得しますが、データベース内のすべての電話番号が確実に一意であれば問題はありません。 – px06

+1

@ px06可能であれば、そこにq.getResultList()以外のメソッドを使用するようアドバイスするつもりでした。 – Gimby

+0

@Gimby申し訳ありませんが、あなたが正しいです。 'List getList = q.getResultList();そうでなければなりません。顧客顧客= getList.get(0); ' – px06

答えて

0

getListResult()を使用する代わりにgetSingleResult()を使用します。これは、1つの型なし結果を返すSELECTクエリを実行します。したがって、一意の型で単一のレコードを取得すると予想される場合は、必ずgetSingleResult()を使用してください。

@Repository 
public class CustomerDetailsDAOImpl implements CustomerDetailsDAO { 

@Autowired 
SessionFactory sessionFactory; 

@Override 
@Transactional 
public List<CustomerDetails> getCustomer(String customerPhone) { 
    Session session = sessionFactory.openSession(); 

    Query q = session.createQuery("from CustomerDetails where customerPhone =:p"); 
    q.setParameter("p", customerPhone); 

    CustomerDetails customer = q.getSingleResult(); 
    session.close(); 
    return customer; 

} 

・ホープ、このことができます:)

0

は、電話番号がデータベースに一意であるようq.getSingleResult()を使用し、クエリがCustomerDetailsクラスの単一オブジェクトを返す代わりにq.getResultList()を使用しないでください。

public CustomerDetails getCustomer(String customerPhone) { 
    Session session = sessionFactory.openSession(); 

    Query q = session.createQuery("from CustomerDetails where customerPhone =:p"); 
    CustomerDetails customer=null; 
    q.setParameter("p", customerPhone); 
    try{ 
     customer = q.getResultList(); 
    }catch(NoResultException ex){ 
    System.out.println(ex.getMessage()); 

    }finally{ 
     session.close(); 
    } 

    return customer; 

} 

:クエリがデータベースからデータを取得しない場合、getSingleResult()NoResultException例外をスローします。 この例外は、あなたの側から処理する必要があります。

参照のために上記の例を使用できます。 NoResultException例外処理のコードを追加しました。

+0

[JPAでgetSingleResult()を使用しない理由](http://sysout.be/2011/03/09/why-you-should-never-use-getsingleresult -in-jpa /)、見て価値がある。 – px06

+0

@ px06に同意します。しかし、user3550981は単一の結果を返したいので、私はこの解決策を提案しました。 – Abhijeet