nhibernate로 여러 DB 엔티티를 삭제하는 방법은 무엇입니까?
-
18-09-2019 - |
문제
이 문제에 대한 모범 사례는 무엇입니까? 배치 기능이 내장되어 있습니까?
샘플 코드 :
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();
제휴하지 않습니다 StackOverflow