> Does it sound like an NHibernate bug?
Yes, the SQL alias sounds like a bug. You will have to find a
workaround :
- You can hard-code the alias in the SQL criterion
var criteria = session.CreateCriteria<Company>()
.CreateAlias("Notes", "Notes")
.Add(Expression.Sql("notes3_.note = ?", noteToFind,
NHibernateUtil.String));
- You can remove the alias (it works fine if you do not have column
name conflicts)
var criteria = session.CreateCriteria<Company>()
.CreateAlias("Notes", "Notes")
.Add(Expression.Sql("note = ?", noteToFind, NHibernateUtil.String));
- You can use an "exists" statement :
var criteria = session.CreateCriteria<Company>()
.Add(new ValueExpression("Notes", noteToFind, "="));
[Serializable]
public class ValueExpression : AbstractCriterion
{
private readonly string collectionName;
private readonly string op;
private readonly object value;
public ValueExpression(string collectionName, object value, string
op)
{
this.collectionName = collectionName;
this.value = value;
this.op = op;
}
public override IProjection[] GetProjections()
{
return null;
}
public override TypedValue[] GetTypedValues(ICriteria criteria,
ICriteriaQuery criteriaQuery)
{
ICollectionPersister persister =
(IQueryableCollection)criteriaQuery.Factory.GetCollectionPersister(criteriaQuery.GetEntityName(criteria)
+ "." + this.collectionName);
return new TypedValue[] { new TypedValue(persister.ElementType,
this.value, EntityMode.Poco) };
}
public override SqlString ToSqlString(ICriteria criteria,
ICriteriaQuery criteriaQuery, IDictionary<string, IFilter>
enabledFilters)
{
IQueryableCollection persister =
(IQueryableCollection)criteriaQuery.Factory.GetCollectionPersister(criteriaQuery.GetEntityName(criteria)
+ "." + this.collectionName);
criteriaQuery.AddUsedTypedValues(this.GetTypedValues(criteria,
criteriaQuery));
string tableName = ((IJoinable)persister).TableName;
SqlStringBuilder builder = new SqlStringBuilder(20);
builder.Add("exists ( select 1 from ").Add(tableName);
builder.Add(" where ").Add(persister.KeyColumnNames[0]).Add(" =
").Add(criteriaQuery.GetIdentifierColumns(criteria)[0]);
builder.Add(" and
").Add(persister.ElementColumnNames[0]).Add(this.op).AddParameter().Add(" )");
return builder.ToSqlString();
}
public override string ToString()
{
return (this.collectionName + this.op + this.value);
}
}
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en.