Which are values of properties of BindLimitParametersFirst BindLimitParametersInReverseOrder SupportsLimit SupportsLimitOffset SupportsVariableLimit UseMaxForLimit
and impls of GetLimitString(SqlString querySqlString, int offset, int limit) GetLimitString(SqlString querySqlString, bool hasOffset) of the dialect you are using ? 2010/3/30 Glenn Paulley <[email protected]> > At first glance, it would appear that Brian's diagnosis is correct - > that this code in Loader.cs is incorrect: > > protected virtual int BindParameterValues(IDbCommand > statement, > QueryParameters queryParameters, > int > startIndex, > ISessionImplementor session) > { > // NH Different behavior: > // The responsibility of parameter binding was > entirely moved to > QueryParameters > // to deal with positionslParameter > +NamedParameter > +ParameterOfFilters > return queryParameters.BindParameters(statement, > GetNamedParameterLocs, 0, session); > } > > Changing the above call to queryParameters.BindParameters to > > return > queryParameters.BindParameters(statement, > GetNamedParameterLocs, startIndex, session); > > > appears to fix the issue, and permits HQL and Criteria requests to > work correctly with pagination performed by a dialect that supports > hostvars for SetFirstResult() and SetMaxResults(). > > On Mar 29, 10:22 pm, Fabio Maulo <[email protected]> wrote: > > If it work with HQL and does not work with Criteria then there is a bug > in > > some place else than the dialect. > > Thanks Glenn. > > > > 2010/3/29 Glenn Paulley <[email protected]> > > > > > > > > > Hi Brian, > > > > > I've reproduced your problem with NH 2.1.0GA - the issue is that the > > > SQLAnywhere11Dialect code works properly with the CreateQuery API, but > > > it does not with the Criteria API. If I modify the HelloNHibernate > > > code to add a Criteria list of Employees, as so: > > > > > static void LoadEmployeesFromDatabase() > > > { > > > using (ISession session = OpenSession()) > > > { > > > IQuery query = session.CreateQuery( > > > "from Employee as emp where name like ? order by > > > emp.name asc"); > > > query.SetString(0, "%David%"); > > > query.SetMaxResults(10); > > > query.SetFirstResult(4); > > > > > IList<Employee> foundEmployees; > > > > > foundEmployees = query.List<Employee>(); > > > > > Console.WriteLine("\n{0} employees found:", > > > foundEmployees.Count); > > > > > foreach (Employee employee in foundEmployees) > > > Console.WriteLine(employee.SayHello()); > > > > > Console.WriteLine("\n Using criteria query"); > > > > > ICriteria crit = > > > session.CreateCriteria(typeof(Employee)); > > > crit.AddOrder(Order.Asc("name")); > > > crit.SetMaxResults(10); > > > crit.SetFirstResult(4); > > > crit.Add(Expression.Like("name", "David", > > > MatchMode.Anywhere)); > > > > > foundEmployees = crit.List<Employee>(); > > > > > Console.WriteLine("\n{0} employees found:", > > > foundEmployees.Count); > > > > > foreach (Employee employee in foundEmployees) > > > Console.WriteLine(employee.SayHello()); > > > > > } > > > } > > > > > The first query is generated correctly, reordering the parameters as > > > required: > > > > > NHibernate: SELECT TOP ? START AT ? employee0_.id as id0_, > > > employee0_.name as na > > > me0_, employee0_.manager as manager0_ from Employee employee0_ where > > > employee0_. > > > name like ? order by employee0_.name asc;p0 = 10, p1 = 4, p2 = '%David > > > %' > > > > > but the second Criteria query causes > > > > > Using criteria query > > > NHibernate: SELECT TOP ? START AT ? this_.id as id0_1_, this_.name as > > > name0_1_, > > > this_.manager as manager0_1_, employee2_.id as id0_0_, employee2_.name > > > as name0_ > > > 0_, employee2_.manager as manager0_0_ FROM Employee this_ left outer > > > join Employ > > > ee employee2_ on this_.manager=employee2_.id WHERE this_.name like ? > > > ORDER BY th > > > is_.name asc;p0 = %David%, p1 = 4, p2 = NULL > > > > > which, as you have seen, is completely erroneous. I wonder if Ayende > > > had thought of Criteria queries when he made his original fix > > > (NH-1528). > > > > > I will try to see what can be done; as far as I can tell the dialect > > > is establishing the parameters (and their order) correctly. > > > > > Glenn > > > > > On Mar 29, 3:17 pm, Brian Weeres <[email protected]> wrote: > > > > Pretty much anything that causes a parameter list to be generated. > > > > > > using (ISession session = > > > > NHibernateHelper.OpenSessionWithAutoFlush()) > > > > { > > > > ICriteria crit = > > > > session.CreateCriteria(typeof(Organization)); > > > > crit.SetMaxResults(500); > > > > crit.Add(Expression.Like("LegalName", > > > > searchCriteria.LegalName, MatchMode.Anywhere)); > > > > List<Organization> orgs = new > > > > List<Organization>(crit.List<Organization>()); > > > > } > > > > > > On Mon, Mar 29, 2010 at 1:26 PM, Glenn Paulley < > [email protected] > > > >wrote: > > > > > > > A code snippet from your application that illustrates your usage of > > > > > SetMaxResults() would be helpful, so that I can try to mimic that > > > > > usage in my testing. > > > > > > > Glenn > > > > > > > On Mar 29, 2:25 pm, Brian Weeres <[email protected]> wrote: > > > > > > Thanks Glenn. I will wait for your results. If you need me to > test > > > > > anything > > > > > > let me know. > > > > > > > > On Mon, Mar 29, 2010 at 1:19 PM, Glenn Paulley < > > > [email protected] > > > > > >wrote: > > > > > > > > > The most recently-posted SQLAnywhere11Dialect does support > > > > > > > SetMaxResults() correctly, at least in my testing with the NH > 2.1.0 > > > GA > > > > > > > release. I do not (yet) have NH 2.1.2 installed, but I am happy > to > > > do > > > > > > > so and try to reproduce the problem you're seeing. > > > > > > > > > Glenn > > > > > > > > > On Mar 29, 12:55 pm, brianw <[email protected]> wrote: > > > > > > > > The Sybase11Dialect error actually turned out to be that > > > particular > > > > > > > > dialect creates outer joins that are no longer supported in > SQL > > > > > > > > Anywhere 11. > > > > > > > > > > The other Sybase 11 dialect I tried is from herehttp:// > > > > > > > > iablog.sybase.com/paulley/2009/09/revised-sql-anywhere-nhibern.... > > > > > > > > (SQLAnywhere11Dialect). This is the one that has the error > with > > > the > > > > > > > > SetMaxRowCounts. > > > > > > > > > > This may be the place I need to make changes but to me the > > > changes > > > > > are > > > > > > > > not obvious without getting a whole lot deeper than I have > the > > > > > > > > inclination to do. I am just trying to use this stuff not > write > > > > > > > > nhibernate and dialects. As long as my dialect returns true > for > > > > > > > > BindLimitParametersFirst, SupportsLimitOffset and > > > > > > > > SupportsVariableLimit which it does then this code in > loader.cs > > > will > > > > > > > > wipe out my limit parameter since the BindParameterValues > call > > > does > > > > > > > > not use the colIndex that is passed in. > > > > > > > > > > if (useLimit && dialect.BindLimitParametersFirst) > > > > > > > > { > > > > > > > > colIndex += BindLimitParameters(command, colIndex, > selection, > > > > > > > > session); > > > > > > > > > > } > > > > > > > > > > colIndex += BindParameterValues(command, queryParameters, > > > colIndex, > > > > > > > > session); > > > > > > > > > > I suppose in the SQLAnywhere11Dialect I have to either change > > > > > > > > GetLimitString or the other settings to get the correct > > > combination. > > > > > I > > > > > > > > think at this point I will just leave my change in loader.cs > in > > > and > > > > > > > > worry about changing the dialect later. > > > > > > > > > > On Mar 29, 10:22 am, Fabio Maulo <[email protected]> > wrote: > > > > > > > > > > > The place where change is the dialect and nothing more than > the > > > > > > > dialect. > > > > > > > > > > > 2010/3/29 brianw <[email protected]> > > > > > > > > > > > > I am using Nhibernate 2.1.2 with Sybase 11. Using > > > Sybase11Dialect > > > > > I > > > > > > > > > > get sql errors using SetMaxResults. The same code works > fine > > > with > > > > > > > > > > SybaseASA10Dialect. The Sybase11 dialect adds a parameter > for > > > the > > > > > TOP > > > > > > > > > > value whereas the SybaseASA10Dialect updates the sql > directly > > > > > with > > > > > > > > > > Select TOP 500 starting at 1. The issues appears to be in > > > > > > > > > > PrepareQueryCommand in loader.cs. The count parameter is > set > > > > > > > correctly > > > > > > > > > > in BindLimitParameters but then it gets wiped out in the > next > > > > > call > > > > > > > > > > which is to BindParameterValues. BindParameterValues is > > > getting > > > > > the > > > > > > > > > > value of 1 for the next parameter to bind which is > correct > > > but > > > > > the > > > > > > > > > > method itself calls queryParameters.BindParameters with a > > > > > hardcoded > > > > > > > > > > zero instead of the passed in starting parameter. This > causes > > > the > > > > > > > > > > first parameter which is the count to get set to whatever > the > > > > > next > > > > > > > > > > parameter is supposed to be. > > > > > > > > > > > > queryParameters.BindParameters(statement, > > > GetNamedParameterLocs, > > > > > 0, > > > > > > > > > > session); > > > > > > > > > > perhaps should be > > > > > > > > > > queryParameters.BindParameters(statement, > > > GetNamedParameterLocs, > > > > > > > > > > startIndex, session); > > > > > > > > > > > > I am reluctant to make this change in my nhibernate code > as I > > > > > really > > > > > > > > > > don't know the full impact of the change. > > > > > > > > > > > > To unsubscribe from this group, send email to > > > > > nhibernate-development+ > > > > > > > > > > unsubscribegooglegroups.com or reply to this email with > the > > > > > words > > > > > > > "REMOVE > > > > > > > > > > ME" as the subject. > > > > > > > > > > > -- > > > > > > > > > Fabio Maulo- Hide quoted text - > > > > > > > > > > > - Show quoted text - > > > > > > > > > To unsubscribe from this group, send email to > > > nhibernate-development+ > > > > > > > unsubscribegooglegroups.com or reply to this email with the > words > > > > > "REMOVE > > > > > > > ME" as the subject. > > > > > > > To unsubscribe from this group, send email to > nhibernate-development+ > > > > > unsubscribegooglegroups.com or reply to this email with the words > > > "REMOVE > > > > > ME" as the subject. > > > > > To unsubscribe from this group, send email to nhibernate-development+ > > > unsubscribegooglegroups.com or reply to this email with the words > "REMOVE > > > ME" as the subject. > > > > -- > > Fabio Maulo > > To unsubscribe from this group, send email to nhibernate-development+ > unsubscribegooglegroups.com or reply to this email with the words "REMOVE > ME" as the subject. > -- Fabio Maulo To unsubscribe from this group, send email to nhibernate-development+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.
