在普通的旧SQL中,我可以这样做:
select * from mytable COLLATE Latin1_General_CS_AS
有没有办法在nHibernate,HQL或条件中指定我想用于给定查询的排序规则类型?
答案 0 :(得分:6)
GermánSchuager设法在运行时指定排序规则。看看here。
var user = session.CreateCriteria(typeof (User))
.Add(Expression.Sql("Username like ? collate Modern_Spanish_CS_AS", username, NHibernateUtil.String))
.UniqueResult<User>();
答案 1 :(得分:2)
从same link而不是rebelliard answer提供,Shuager还提供了一种定义自定义函数的方法来执行类似操作。这具有可在HQL中使用的优点。
他的自定义函数实现对于你的问题和我自己的需求来说太具体了,所以这是我已经结束的实现:
/// <summary>
/// Customized dialect for allowing changing collation on <c>like</c> statements.
/// </summary>
public class CustomMsSqlDialect : MsSql2008Dialect
{
/// <summary>
/// Default constructor.
/// </summary>
public CustomMsSqlDialect()
{
RegisterFunction("withcollation",
new WithCollationFunction());
}
}
/// <summary>
/// Add collation to string argument.
/// </summary>
[Serializable]
public class WithCollationFunction : SQLFunctionTemplate, IFunctionGrammar
{
/// <summary>
/// Default constructor.
/// </summary>
public WithCollationFunction()
: base(NHibernateUtil.String, "?1 collate ?2")
{
}
bool IFunctionGrammar.IsSeparator(string token)
{
return false;
}
bool IFunctionGrammar.IsKnownArgument(string token)
{
return Regex.IsMatch(token, "[A-Z][A-Z0-9_]+_(?:CS|CI)_(?:AS|AI)(?:_KS)?(?:_WS)?", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
}
}
介意方言基类,我用过2008方言,你不妨改变一下。 不要忘记将您的HQL方言更改为新的自定义方言(例如,使用会话工厂的“dialect”配置属性)。
HQL中的示例用法,没有归类自定义的标准查询:
from Cat as c
where c.Name like 'fel%'
使用自定义归类
from Cat as c
where c.Name like withCollation('fel%', French_CI_AI)
与Nhib 3.2合作。