zoukankan      html  css  js  c++  java
  • NHibernate开源框架Cuyahoga学习之数据访问实现

    代码
    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
        }
    }

  • 相关阅读:
    Leetcode: Rotate Image
    Leetcode: Longest Palindromic Substring && Summary: Palindrome
    Leetcode: Reverse Nodes in k-Group
    Leetcode: Substring with Concatenation of All Words
    Leetcode: Merge k Sorted List
    Summary: Java中函数参数的传递
    Leetcode: Generate Parentheses
    超级wifi
    路由器中继(repeater)模式 和 AP+WDS模式区别?
    route 的标志位
  • 原文地址:https://www.cnblogs.com/hubcarl/p/1706403.html
Copyright © 2011-2022 走看看