2014年12月2日 星期二

[SQL]increment rownum by value




參考:http://stackoverflow.com/questions/10477085/oracle-partition-by-and-row-number-keyword
http://www.techhoney.com/oracle/clause/row_number-clause-in-oracle-sql-plsql/

SELECT  LINE_ATTRIBUTE3,   ROW_NUMBER () over (partition by LINE_ATTRIBUTE3 order by LINE_ATTRIBUTE3)  FROM t_cht_si_ap_ebs_out ;


output
0214V00000009 3
0214V00000010 1
0214V00000011 1
0214V00000012 1
0214V00000012 2
0214V00000013 1
0214V00000014 1
0214V00000014 2
0214V00000014 3
0214V00000015 1
0214V00000015 2
0214V00000015 3


另外還有其他排序方式
參考:
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC)  
RANK()       OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC) 
DENSE_RANK() OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC) 

https://tw.news.yahoo.com/%E9%98%B2%E8%83%83%E9%A3%9F%E9%81%93%E9%80%86%E6%B5%81-%E5%B0%91%E5%96%9D%E5%92%96%E5%95%A15%E6%8B%9B%E6%90%9E%E5%AE%9A-040404333.html

2014年8月5日 星期二

[Hibernate]insert one record multiple times

前言:

在hibernate底下,做insert同一筆record多次時,遇到以下問題


(1)如果同一筆資料insert兩次,會變成第二次update同一筆資料


(2)如果把id設為null,再save會跳出下面exception
entifier of an instance of was altered from to null

(3)如果把id設為0或其他值,再save會跳出下面exception
identifier of an instance of was altered from to n


解決方式:
      先new Entity,copyProperties後再save

Reference:http://my.oschina.net/liangzhenghui/blog/194939

2014年7月21日 星期一

[JAVA] String 相關工具

   /**
     * 取得字串長度(中文為2,數字為1,半形為1,全形為2)
     *
     * @param value
     * @return
     */
    public static int strLength(final String value) {
        int length = 0;
        String str = (value == null) ? "" : value; // 避免null,造成exception
        char character;
       
        for (int i = 0; i < str.length(); i++) {
            character = str.charAt(i);
            // 若不為英文字,或半形時,長度加1(長度算2)
            if (Character.UnicodeBlock.of(character) != Character.UnicodeBlock.BASIC_LATIN || !isHalfWidth(character)) {
                length++;
            }
           
            length++;
        }
       
        return length;
    }

    /**
     * 判斷是否為半形
     *
     * @param character
     * @return
     */
    public static boolean isHalfWidth(char c)   {
        return '\u0000' <= c && c <= '\u00FF'
            || '\uFF61' <= c && c <= '\uFFDC'
            || '\uFFE8' <= c && c <= '\uFFEE' ;

    }


2014年6月4日 星期三

[Shiro] url get multiple roles

在spring-security中,如果要對網址控管多個角色可進入
一般會透過roles[admin]
ex: /admin/** = user, roles[admin] 

但是 roles["admin,guest"] ,會被認定要符合這些角色(hasAllRoles)
因此,必須自己去定義,改寫RolesAuthorizationFilter就可以
參考這篇
http://blog.abelsky.com/2014/01/27/make-apache-shiro-allow-several-roles-to-access-resource/

public class AnyOfRolesAuthorizationFilter extends RolesAuthorizationFilter {
 
    @Override
    public boolean isAccessAllowed(ServletRequest request, ServletResponse response,
                                   Object mappedValue) throws IOException {
 
        final Subject subject = getSubject(request, response);
        final String[] rolesArray = (String[]) mappedValue;
 
        if (rolesArray == null || rolesArray.length == 0) {
            //no roles specified, so nothing to check - allow access.
            return true;
        }
 
        for (String roleName : rolesArray) {
            if (subject.hasRole(roleName)) {
                return true;
            }
        }
 
        return false;
    }
}

最後在spring-security.xml中加入
<bean id="anyOfRoles" class="com.your.package.AnyOfRolesAuthorizationFilter" />
就可以透過anyOfRoles去使用多個角色
/path/to/some/url = anyofroles["role1,role2"]

Other reference:
http://shiro-user.582556.n2.nabble.com/Shiro-ini-multiple-roles-for-one-url-td6806837.html