![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
using
System;
using System.Collections;
using System.Collections.Generic;
using Castle.Facilities.NHibernateIntegration;
using Castle.Services.Transaction;
using Cuyahoga.Core.Util;
using NHibernate;
using NHibernate.Criterion;
using Cuyahoga.Core.Domain;
namespace Cuyahoga.Core.DataAccess
{
/// <summary>
/// Provides data access for user-related components.
/// </summary>
[Transactional]
public class UserDao : IUserDao
{
private ISessionManager _sessionManager;
private ICommonDao _commonDao;
/// <summary>
/// Default constructor;
/// </summary>
/// <param name="sessionManager"></param>
public UserDao(ISessionManager sessionManager, ICommonDao commonDao)
{
this ._sessionManager = sessionManager;
this ._commonDao = commonDao;
}
#region IUserDao Members
public User GetUserByUsernameAndPassword( string username, string password)
{
ISession session = this ._sessionManager.OpenSession();
ICriteria crit = session.CreateCriteria( typeof (User));
crit.Add(Expression.Eq( " UserName " , username));
crit.Add(Expression.Eq( " Password " , password));
IList results = crit.List();
if (results.Count == 1 )
{
return (User)results[ 0 ];
}
else if (results.Count > 1 )
{
throw new Exception(String.Format( " Multiple users found with the give username and password. Something is pretty wrong here " ));
}
else
{
return null ;
}
}
public IList FindUsersByUsername( string searchString)
{
if (searchString.Length > 0 )
{
ISession session = this ._sessionManager.OpenSession();
string hql = " from User u where u.UserName like ? order by u.UserName " ;
return session.Find(hql, searchString + " % " , NHibernateUtil.String);
}
else
{
return this ._commonDao.GetAll( typeof (User), " UserName " );
}
}
// 根据条件分页
public IList < User > FindUsers( string username, int ? roleId, bool ? isActive, int ? siteId, int pageSize, int pageNumber, out int totalCount)
{
ISession session = this ._sessionManager.OpenSession();
ICriteria userCriteria = session.CreateCriteria( typeof (User));
ICriteria countCriteria = session.CreateCriteria( typeof (User), " userCount " );
if ( ! String.IsNullOrEmpty(username))
{
// username相似:从开始匹配
userCriteria.Add(Expression.InsensitiveLike( " UserName " , username, MatchMode.Start));
countCriteria.Add(Expression.InsensitiveLike( " UserName " , username, MatchMode.Start));
}
if (roleId.HasValue)
{
userCriteria.CreateCriteria( " Roles " , " r1 " ).Add(Expression.Eq( " r1.Id " , roleId));
countCriteria.CreateCriteria( " Roles " , " r1 " ).Add(Expression.Eq( " r1.Id " , roleId));
}
if (isActive.HasValue)
{
userCriteria.Add(Expression.Eq( " IsActive " , isActive));
countCriteria.Add(Expression.Eq( " IsActive " , isActive));
}
if (siteId.HasValue && ! roleId.HasValue)
{
DetachedCriteria roleIdsForSite = DetachedCriteria.For( typeof (Role))
.SetProjection(Projections.Property( " Id " ))
.CreateCriteria( " Sites " , " site " ) // Sites 别名site
.Add(Expression.Eq( " site.Id " , siteId.Value));
DetachedCriteria userIdsForRoles = DetachedCriteria.For( typeof (User))
.SetProjection(Projections.Distinct(Projections.Property( " Id " )))
.CreateCriteria( " Roles " )
.Add(Subqueries.PropertyIn( " Id " , roleIdsForSite));
userCriteria.Add(Subqueries.PropertyIn( " Id " , userIdsForRoles));
countCriteria.Add(Subqueries.PropertyIn( " Id " , userIdsForRoles));
// 里面的属性方法有待进一步查阅资料
}
userCriteria.SetFirstResult((pageNumber - 1 ) * pageSize);
userCriteria.SetMaxResults(pageSize);
countCriteria.SetProjection(Projections.RowCount());
totalCount = ( int ) countCriteria.UniqueResult();
return userCriteria.List < User > ();
}
public IList < Section > GetViewableSectionsByUser(User user)
{
// :userId参数User和Role进行了关联映射所以可以用u.Rolse来获取Role的相关数据
string hql = " select s from User u join u.Roles as r, Section s join s.SectionPermissions sp " +
" where u.Id = :userId and r.Id = sp.Role.Id and sp.ViewAllowed = 1 " ;
IQuery q = this ._sessionManager.OpenSession().CreateQuery(hql);
q.SetInt32( " userId " , user.Id);
return q.List < Section > ();
}
public IList < Section > GetViewableSectionsByAccessLevel(AccessLevel accessLevel)
{
int permission = ( int )accessLevel;
string hql = " select s from Section s join s.SectionPermissions sp, Role r " +
" where r.PermissionLevel = :permission and r.Id = sp.Role.Id and sp.ViewAllowed = 1 " ;
IQuery q = this ._sessionManager.OpenSession().CreateQuery(hql);
q.SetInt32( " permission " , permission);
return q.List < Section > ();
}
public IList < Role > GetRolesByRightName( string rightName)
{
string hql = " select r from Role r join r.Rights right where right.Name = :rightName " ;
IQuery q = this ._sessionManager.OpenSession().CreateQuery(hql);
q.SetString( " rightName " , rightName);
return q.List < Role > ();
}
public IList < Role > GetAllRolesBySite(Site site)
{
ISession session = this ._sessionManager.OpenSession();
ICriteria crit = session.CreateCriteria( typeof (Role))
.AddOrder(Order.Asc( " Name " ))
.CreateCriteria( " Sites " )
.Add(Expression.Eq( " Id " , site.Id));
return crit.List < Role > ();
}
[Transaction(TransactionMode.Requires)]
public void SaveOrUpdateUser(User user)
{
ISession session = this ._sessionManager.OpenSession();
session.SaveOrUpdate(user);
}
[Transaction(TransactionMode.Requires)]
public void DeleteUser(User user)
{
ISession session = this ._sessionManager.OpenSession();
session.Delete(user);
}
#endregion
}
}
using System.Collections;
using System.Collections.Generic;
using Castle.Facilities.NHibernateIntegration;
using Castle.Services.Transaction;
using Cuyahoga.Core.Util;
using NHibernate;
using NHibernate.Criterion;
using Cuyahoga.Core.Domain;
namespace Cuyahoga.Core.DataAccess
{
/// <summary>
/// Provides data access for user-related components.
/// </summary>
[Transactional]
public class UserDao : IUserDao
{
private ISessionManager _sessionManager;
private ICommonDao _commonDao;
/// <summary>
/// Default constructor;
/// </summary>
/// <param name="sessionManager"></param>
public UserDao(ISessionManager sessionManager, ICommonDao commonDao)
{
this ._sessionManager = sessionManager;
this ._commonDao = commonDao;
}
#region IUserDao Members
public User GetUserByUsernameAndPassword( string username, string password)
{
ISession session = this ._sessionManager.OpenSession();
ICriteria crit = session.CreateCriteria( typeof (User));
crit.Add(Expression.Eq( " UserName " , username));
crit.Add(Expression.Eq( " Password " , password));
IList results = crit.List();
if (results.Count == 1 )
{
return (User)results[ 0 ];
}
else if (results.Count > 1 )
{
throw new Exception(String.Format( " Multiple users found with the give username and password. Something is pretty wrong here " ));
}
else
{
return null ;
}
}
public IList FindUsersByUsername( string searchString)
{
if (searchString.Length > 0 )
{
ISession session = this ._sessionManager.OpenSession();
string hql = " from User u where u.UserName like ? order by u.UserName " ;
return session.Find(hql, searchString + " % " , NHibernateUtil.String);
}
else
{
return this ._commonDao.GetAll( typeof (User), " UserName " );
}
}
// 根据条件分页
public IList < User > FindUsers( string username, int ? roleId, bool ? isActive, int ? siteId, int pageSize, int pageNumber, out int totalCount)
{
ISession session = this ._sessionManager.OpenSession();
ICriteria userCriteria = session.CreateCriteria( typeof (User));
ICriteria countCriteria = session.CreateCriteria( typeof (User), " userCount " );
if ( ! String.IsNullOrEmpty(username))
{
// username相似:从开始匹配
userCriteria.Add(Expression.InsensitiveLike( " UserName " , username, MatchMode.Start));
countCriteria.Add(Expression.InsensitiveLike( " UserName " , username, MatchMode.Start));
}
if (roleId.HasValue)
{
userCriteria.CreateCriteria( " Roles " , " r1 " ).Add(Expression.Eq( " r1.Id " , roleId));
countCriteria.CreateCriteria( " Roles " , " r1 " ).Add(Expression.Eq( " r1.Id " , roleId));
}
if (isActive.HasValue)
{
userCriteria.Add(Expression.Eq( " IsActive " , isActive));
countCriteria.Add(Expression.Eq( " IsActive " , isActive));
}
if (siteId.HasValue && ! roleId.HasValue)
{
DetachedCriteria roleIdsForSite = DetachedCriteria.For( typeof (Role))
.SetProjection(Projections.Property( " Id " ))
.CreateCriteria( " Sites " , " site " ) // Sites 别名site
.Add(Expression.Eq( " site.Id " , siteId.Value));
DetachedCriteria userIdsForRoles = DetachedCriteria.For( typeof (User))
.SetProjection(Projections.Distinct(Projections.Property( " Id " )))
.CreateCriteria( " Roles " )
.Add(Subqueries.PropertyIn( " Id " , roleIdsForSite));
userCriteria.Add(Subqueries.PropertyIn( " Id " , userIdsForRoles));
countCriteria.Add(Subqueries.PropertyIn( " Id " , userIdsForRoles));
// 里面的属性方法有待进一步查阅资料
}
userCriteria.SetFirstResult((pageNumber - 1 ) * pageSize);
userCriteria.SetMaxResults(pageSize);
countCriteria.SetProjection(Projections.RowCount());
totalCount = ( int ) countCriteria.UniqueResult();
return userCriteria.List < User > ();
}
public IList < Section > GetViewableSectionsByUser(User user)
{
// :userId参数User和Role进行了关联映射所以可以用u.Rolse来获取Role的相关数据
string hql = " select s from User u join u.Roles as r, Section s join s.SectionPermissions sp " +
" where u.Id = :userId and r.Id = sp.Role.Id and sp.ViewAllowed = 1 " ;
IQuery q = this ._sessionManager.OpenSession().CreateQuery(hql);
q.SetInt32( " userId " , user.Id);
return q.List < Section > ();
}
public IList < Section > GetViewableSectionsByAccessLevel(AccessLevel accessLevel)
{
int permission = ( int )accessLevel;
string hql = " select s from Section s join s.SectionPermissions sp, Role r " +
" where r.PermissionLevel = :permission and r.Id = sp.Role.Id and sp.ViewAllowed = 1 " ;
IQuery q = this ._sessionManager.OpenSession().CreateQuery(hql);
q.SetInt32( " permission " , permission);
return q.List < Section > ();
}
public IList < Role > GetRolesByRightName( string rightName)
{
string hql = " select r from Role r join r.Rights right where right.Name = :rightName " ;
IQuery q = this ._sessionManager.OpenSession().CreateQuery(hql);
q.SetString( " rightName " , rightName);
return q.List < Role > ();
}
public IList < Role > GetAllRolesBySite(Site site)
{
ISession session = this ._sessionManager.OpenSession();
ICriteria crit = session.CreateCriteria( typeof (Role))
.AddOrder(Order.Asc( " Name " ))
.CreateCriteria( " Sites " )
.Add(Expression.Eq( " Id " , site.Id));
return crit.List < Role > ();
}
[Transaction(TransactionMode.Requires)]
public void SaveOrUpdateUser(User user)
{
ISession session = this ._sessionManager.OpenSession();
session.SaveOrUpdate(user);
}
[Transaction(TransactionMode.Requires)]
public void DeleteUser(User user)
{
ISession session = this ._sessionManager.OpenSession();
session.Delete(user);
}
#endregion
}
}