NHibernate开源框架Cuyahoga学习之数据访问实现

ExpandedBlockStart.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
    }
}

 

转载于:https://www.cnblogs.com/hubcarl/archive/2011/03/15/1706403.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值