public Personal loadPersonal(final Long actorId) {
    final StringBuffer hql =
        new StringBuffer("select p.id,p.uid_,p.status_,p.font,p.theme,p.aid,p.inner_");
    hql.append(" from BC_DESKTOP_PERSONAL p where p.aid=0 or p.aid=? order by p.id desc");
    if (logger.isDebugEnabled()) {
      logger.debug("actorId=" + actorId + ",hql=" + hql);
    }
    try {
      return jpaTemplate.execute(
          new JpaCallback<Personal>() {
            public Personal doInJpa(EntityManager em) throws PersistenceException {
              Query queryObject = em.createNativeQuery(hql.toString());
              // jpaTemplate.prepareQuery(queryObject);

              // 注入参数
              queryObject.setParameter(1, actorId); // jpa的索引号从1开始
              queryObject.setFirstResult(0);
              queryObject.setMaxResults(1); // 仅获取1条

              Personal p =
                  new RowMapper<Personal>() {
                    public Personal mapRow(Object[] rs, int rowNum) {
                      Personal map = new Personal();
                      int i = 0;
                      map.setId(new Long(rs[i++].toString()));
                      map.setUid(rs[i] != null ? rs[i].toString() : null);
                      i++;
                      map.setStatus(Integer.parseInt(rs[i++].toString()));
                      map.setFont(rs[i++].toString());
                      map.setTheme(rs[i++].toString());
                      map.setActorId(new Long(rs[i++].toString()));
                      map.setInner("1".equals(rs[i++].toString()));

                      return map;
                    }
                  }.mapRow((Object[]) queryObject.getSingleResult(), 0);

              // 如果是全局配置就将其改为当前用户的配置
              if (p.getActorId().equals(0)) {
                p.setActorId(actorId);
              }
              return p;
            }
          });
    } catch (NoResultException e) {
      return null;
    }
  }
  /**
   * Метод для выполнения запроса на изменение данных (delete, update) с выполнением всех
   * необходимых операций, таких как создание EntityManager, открытие транзакции, выполнение commit
   * или roll back.
   *
   * <p>Метод задает параметры для запроса из списка начиная с 1. Первый параметр в запросе будет
   * <code>?1</code>, второй <code>?2</code> и т.д.
   *
   * @param queryOrQueryName строка запроса или название NamedQuery
   * @param namedQuery тип запроса (NamedQuery если true, обычный запрос если false)
   * @param parameters параметры через запятую (будут использоваться в запросе)
   * @return количество измененнных записей в базе
   * @throws IllegalArgumentException нет запроса
   * @throws GeneralServiceException
   */
  @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
  protected int executeUpdateQuery(
      final String queryOrQueryName, final boolean namedQuery, final Object... parameters)
      throws IllegalArgumentException, GeneralServiceException {

    if (null == queryOrQueryName || queryOrQueryName.isEmpty()) {
      throw new IllegalArgumentException("Query for executing cannot be empty");
    }

    try {
      Object rez =
          jpaTemplate.execute(
              new JpaCallback() {

                public Object doInJpa(EntityManager em) throws PersistenceException {

                  Query query;

                  if (namedQuery) {
                    query = em.createNamedQuery(queryOrQueryName);
                  } else {
                    query = em.createQuery(queryOrQueryName);
                  }

                  if (parameters.length > 0) {
                    for (int i = 0; i < parameters.length; i++) {
                      query.setParameter(i + 1, parameters[i]);
                    }
                  }

                  return Integer.valueOf(query.executeUpdate());
                }
              });

      return ((Integer) rez).intValue();

    } catch (Exception e) {
      throw new GeneralServiceException(e);
    }
  }
  public Map<String, Object> loadActorByCode(final String actorCode) {
    final StringBuffer hql =
        new StringBuffer(
            "select a.id as id,a.uid_ as uid_,a.type_ as type_,a.code as code,a.name as name");
    hql.append(",a.pcode as pcode,a.pname as pname,t.password as password,h.id as hid");
    hql.append(" from bc_identity_actor as a");
    hql.append(" inner join bc_identity_auth as t on t.id=a.id");
    hql.append(" inner join bc_identity_actor_history as h on h.actor_id=a.id");
    hql.append(" where a.code = ? and h.current='1' order by h.create_date desc");
    if (logger.isDebugEnabled()) {
      logger.debug("actorCode=" + actorCode + ",hql=" + hql);
    }
    try {
      return jpaTemplate.execute(
          new JpaCallback<Map<String, Object>>() {
            public Map<String, Object> doInJpa(EntityManager em) throws PersistenceException {
              Query queryObject = em.createNativeQuery(hql.toString());
              // jpaTemplate.prepareQuery(queryObject);

              // 注入参数
              queryObject.setParameter(1, actorCode); // jpa的索引号从1开始
              queryObject.setFirstResult(0);
              queryObject.setMaxResults(1); // 仅获取最新的那条(基于bc_identity_actor_history的create_date)

              return new RowMapper<Map<String, Object>>() {
                public Map<String, Object> mapRow(Object[] rs, int rowNum) {
                  Map<String, Object> map = new HashMap<String, Object>();

                  int i = 0;
                  // actor
                  Actor actor = new Actor();
                  actor.setId(new Long(rs[i++].toString()));
                  actor.setUid(rs[i++].toString());
                  actor.setType(Integer.parseInt(rs[i++].toString()));
                  actor.setCode(rs[i++].toString());
                  actor.setName(rs[i++].toString());
                  actor.setPcode(rs[i++].toString());
                  actor.setPname(rs[i++].toString());

                  // auth
                  AuthData auth = new AuthData();
                  auth.setId(actor.getId());
                  auth.setPassword(rs[i++].toString());

                  // history
                  ActorHistory history = new ActorHistory();
                  history.setId(new Long(rs[i++].toString()));
                  // history.setId(getActorHistoryId(actor.getId()));
                  history.setActorId(actor.getId());
                  history.setActorType(actor.getType());
                  history.setName(actor.getName());
                  history.setPcode(actor.getPcode());
                  history.setPname(actor.getPname());

                  map.put("actor", actor);
                  map.put("auth", auth);
                  map.put("history", history);
                  return map;
                }
              }.mapRow((Object[]) queryObject.getSingleResult(), 0);
            }
          });
    } catch (EmptyResultDataAccessException e) {
      return new HashMap<String, Object>(0);
    }
  }