为什么Nhibernate不能为我创建这个简单的查询?

时间:2010-08-03 10:10:27

标签: .net nhibernate antlr

我无法理解为什么不创建这个简单的查询。我从一个测试中调用了这个方法,它抛出一个异常抱怨第1行,第7列,我看不出有什么不对。

    public IList<Continent> GetContinentByName(string name)
      {
       ISession session = GetSession();

       IQuery query = 
                         session.CreateQuery("select from Continent where Continent.ContinentShort='Atlantis'");

// (........) Next step will be getting the list from the query if I can make it work

我在

下面获得了antlr例外

TestCase'M:DataAccessLayer.HibernateDataProvider.GetContinentByName(System.String)' 失败:抛出了类型'Antlr.Runtime.NoViableAltException'的异常。靠近第1行第7列  NHibernate.Hql.Ast.ANTLR.QuerySyntaxException:抛出了类型'Antlr.Runtime.NoViableAltException'的异常。靠近第1行第7列

有什么建议吗?

由于

3 个答案:

答案 0 :(得分:6)

session.CreateQuery驱逐HQL查询,如下所示: sess.CreateQuery("from DomesticCat cat where cat.Name in (:namesList)");

如果您尝试推送本机SQL查询,则必须执行以下操作: session.CreateSQLQuery("SELECT {cat.*} FROM CAT {cat} WHERE ROWNUM<10", "cat", typeof(Cat))

然而,这不是使用NHibernate的好方法。

有关详细信息,请参阅Nhibernate文档:http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-querying

答案 1 :(得分:1)

我认为它期望您提供完整实体名称的别名。尝试:

IQuery query = session.CreateQuery("from Continent c where c.ContinentShort='Atlantis'");

如果这不能解决问题,请显示Continent的映射。

答案 2 :(得分:0)

O.K。

问题是开头的'选择'。似乎它在我使用的版本中无效。 所以,一旦我在开始时删除了“选择”,它就运行良好!