29

タイプAのオブジェクトがDBに格納されているとします。hibernateを使用してDBから特定のものをロードする方法は次のとおりです。

org.hibernate.Session session = ...;
long id = 1;
A obj = session.load(A.class, id);

id = 1のオブジェクトが存在しない場合、ObjectNotFoundExceptionが発生します。しかし、例外をキャッチすることなく、そのようなオブジェクトが存在するかどうかを確認する方法はありますか?私が欲しいのは次のようなsmthです。

org.hibernate.Session session = ...;
long id = 1;
boolean exists = session.exists(A.class, id);
if(exists){
 // do smth.....
}

休止状態のドキュメントが見つかりませんでした...

4

4 に答える 4

47

オブジェクトの存在を確認するためにHQLを使用できます。

public Boolean exists (DTOAny instance) {
    Query query = getSession().             
    createQuery("select 1 from DTOAny t where t.key = :key");
        query.setString("key", instance.getKey() );
    return (query.uniqueResult() != null);
}

データが見つからない場合、Hibernatesの uniqueResult()メソッドは null を返します。HQL を使用すると、より複雑なクエリ条件を作成できます。

于 2011-07-22T21:16:42.287 に答える
25

あなたが使用することができますsession.get

public Object get(Class clazz,
                  Serializable id)
           throws HibernateException

オブジェクトがデータベースに存在しない場合はnullを返します。詳細については、HibernateAPIドキュメントを参照してください。

于 2008-10-21T11:34:18.450 に答える
11

休止状態

最適なパフォーマンスのためにキーのみをフェッチします。

public boolean exists(Class clazz, String idKey, Object idValue) {
    return getSession().createCriteria(clazz)
            .add(Restrictions.eq(idKey, idValue))
            .setProjection(Projections.property(idKey))
            .uniqueResult() != null;
}

JPA

Hibernate は JPA の実装であるため、EntityManagerを注入することができます。このメソッドは、インスタンスを遅延フェッチするため、パフォーマンスも優れています。

public boolean exists(Class clazz, Object key) {
   try {
      return entitymanager.getReference(Entity.class, key) != null;
   } catch (EntityNotFoundException.class) {
      return false;
   }
}
于 2015-06-02T13:59:26.943 に答える
5

@Journeycorner の少し単純化された方法

public boolean exists(Class<?> clazz, Object idValue) {
    return getSession().createCriteria(clazz)
            .add(Restrictions.idEq(idValue))
            .setProjection(Projections.id())
            .uniqueResult() != null;
}

以下の方法も役立ちます。このメソッドは、複数のレコードを生成できない基準 (Restrictions.idEq()基準など)でのみ使用できることに注意してください。

public static boolean uniqueExists(Criteria uniqueCriteria) {
    uniqueCriteria.setProjection(Projections.id());
    return uniqueCriteria.uniqueResult() != null;
}
于 2017-02-23T00:20:11.353 に答える