2013-10-11 2 views
0

두 클래스에 대해 HQL을 사용하여 결과를 얻으려고했습니다. 한 테이블에서 작동하지만 두 테이블에서 작동하지 않습니다.nhibernate HQL 두 개 또는 여러 테이블 중에서 선택하십시오.

아래의 두 엔티티;

public class A_CUSTOMER 
    { 
     public virtual string CUSTOMER_NO { get; set; } 
     public virtual string ADDRESS_LINE { get; set; } 

     public virtual IList<A_ACCOUNT> ACCOUNTS { get; set; } 
    } 

public class A_ACCOUNT 
    { 
     public virtual string AC_NO { get; set; } 
     public virtual string CUST_NO { get; set; } 
     public virtual string CCY { get; set; } 
     public virtual string AVL_BAL { get; set; } 


     public virtual A_CUSTOMER CUSTOMER { get; set; } 

    } 

아래 클래스의 매핑. 이제

public class A_CUSTOMERMap:ClassMap<A_CUSTOMER> 
    { 
     public A_CUSTOMERMap() 
     { 
      Id(x => x.CUSTOMER_NO); 
      Map(x => x.ADDRESS_LINE); 

      HasMany(x => x.ACCOUNTS).KeyColumns.Add("CUST_NO"); 
     } 
    } 


public class A_CUST_ACCOUNTMap:ClassMap<A_CUST_ACCOUNT> 
    { 
     public A_CUST_ACCOUNTMap() 
     { 
      Id(x => x.AC_NO); 
       Map(x=>x.CUST_NO); 
       Map(x => x.AVL_BAL); 
       Map(x => x.CCY); 
       References(x => x.CUSTOMER,"CUST_NO"); 

     } 
    } 

, 나는 내 컨트롤러에서이 같은 코드를 가지고 : 나는 또한 다른 쿼리 문자열 시도

string myString = "1001,1002,1003,1004,1005"; 
var indNumbers = myString.Split(','); 
string qry = @"select h.AC_NO,h.BRANCH_CODE,h.CUST_NO,h.CCY,h.AVL_BAL ,g.ADDRESS_LINE"+ 
       "from A_ACCOUNT as h,A_CUSTOMER g "+ 
       "where h.CUST_NO=g.CUSTOMER_NO AND h.AC_NO IN (:list)"; 
       ; 
res = session.CreateQuery(qry) 
     .SetParameterList("list", indNumbers) 
     .List(); 

:

string qry = @"select h.AC_NO,h.BRANCH_CODE,h.CUST_NO,h.CCY,h.AVL_BAL ,g.ADDRESS_LINE"+ 
       "from A_ACCOUNT as h left join A_CUSTOMER g on "+ 
       "h.CUST_NO=g.CUSTOMER_NO"+ 
       "where h.AC_NO IN (:list)"; 

이 오류가 아래의 발생을, 어떤 도움이 될 것입니다 매우 감사. " + " 예를 들어, - :

NHibernate.Hql.Ast.ANTLR.QuerySyntaxException was unhandled by user code 
    HResult=-2146232832 
    Message=Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. near line 1, column 83 
    Source=NHibernate 
    StackTrace: 
     at NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException() 
     at NHibernate.Hql.Ast.ANTLR.HqlParseEngine.Parse() 
     at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryString, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) 
     at NHibernate.Engine.Query.HQLStringQueryPlan.CreateTranslators(String hql, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) 
     at NHibernate.Engine.Query.HQLStringQueryPlan..ctor(String hql, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) 
     at NHibernate.Engine.Query.HQLStringQueryPlan..ctor(String hql, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) 
     at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(String queryString, Boolean shallow, IDictionary`2 enabledFilters) 
     at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(String query, Boolean shallow) 
     at NHibernate.Impl.AbstractSessionImpl.CreateQuery(String queryString) 
     at MvcApplication2.Controllers.CustAccountController.GetCustData(jQueryDataTableParamModel param) in ... 
     at lambda_method(Closure , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() 
     at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) 
     at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() 
    InnerException: 

답변

1

당신은 따옴표의 모든 항목을 삭제하려면이 옵션을 rerite하는 from

string qry = @"select h.AC_NO,h.BRANCH_CODE,h.CUST_NO,h.CCY,h.AVL_BAL ,g.ADDRESS_LINE"+ 
        "from A_ACCOUNT as h,A_CUSTOMER g "+ 
        "where h.CUST_NO=g.CUSTOMER_NO AND h.AC_NO IN (:list)"; 

한 가지 방법 단어 ADDRESS_LINE 후 두 번째 줄 앞에 공간입니다 누락 내 샘플에서

var qry = @"select h.AC_NO,h.BRANCH_CODE,h.CUST_NO,h.CCY,h.AVL_BAL ,g.ADDRESS_LINE 
          from A_ACCOUNT as h,A_CUSTOMER g 
          where h.CUST_NO=g.CUSTOMER_NO AND h.AC_NO IN (:list)"; 

공지 사항 난 단지 "을 끝나는 시작 " (인용)와 있습니다.

0

Rippo이 외에도 나는 여전히 HQL 대신 내가 변경

별칭 참조 이름에 클래스 이름을 참조 알게되었다, 간격 및 견적에 대한 옳았다 "A_ACCOUNT as h left join A_CUSTOMER g on" 에 "from A_ACCOUNT as h left join h.CUSTOMER g on"

이 있었어야

string qry = @"select h.AC_NO,h.BRANCH_CODE,h.CUST_NO,h.CCY,h.AVL_BAL ,g.ADDRESS_LINE"+ 
       "from A_ACCOUNT as h left join h.CUSTOMER g on "+ 
       "h.CUST_NO=g.CUSTOMER_NO"+ 
       "where h.AC_NO IN (:list)"; 
관련 문제