문제

이 문제에 대한 모범 사례는 무엇입니까? 배치 기능이 내장되어 있습니까?

샘플 코드 :

using (ITransaction transaction = _session.BeginTransaction())
{
   _session.Delete("FROM myObject o WHERE  o.Id = IN(1,2,...99999)");
   transaction.Commit();
}

미리 감사드립니다.

도움이 되었습니까?

해결책

HQL은 in 절을 지원하며 SetParameterList를 사용하는 경우 컬렉션을 전달할 수도 있습니다.

var idList = new List<int>() { 5,3,6,7 };

_session.CreateQuery("DELETE MyDataClass o WHERE o.Id IN (:idList)")
    .SetParameterList("idList", idList)
    .ExecuteUpdate();

Ddango의 의견에서 언급 한 것처럼, HQL 쿼리를 실행하는 것은 단순히 DB 쿼리로 번역되므로 실제로 엔티티 객체를로드하지 않기 때문에 객체에 지정된 관계 캐스케이드가 실행되지 않을 것입니다.

다른 팁

일에 대한 답을 얻는 데 문제가 있었고 다음 쿼리가 100% 작동했습니다.

        Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
            .SetParameterList("deleteIds", deleteIds)
            .ExecuteUpdate();

고객은 테이블 이름이 아닌 클래스 이름입니다. ID는 소문자이고 HQL에서는 클래스의 속성 이름이 아닌 기본 키입니다 (속성 이름이 지원됨)

HQL을 사용하여 여러 객체를 삭제할 수 있습니다

session.delete 예를 위해 여기에서 삭제를 찾으십시오

HQL 삭제 예제 (HQL과 함께 사용할 수 있음) :

ISession session = sessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();

String hqlDelete = "delete Customer c where c.name = :oldName";
// or String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = session.CreateQuery( hqlDelete )
        .SetString( "oldName", oldName )
        .ExecuteUpdate();
tx.Commit();
session.Close();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top