posts - 35, comments - 0, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2012年6月5日

2012.09.19 office for mac 2011更新到14.2.4版本,最大的变化就是解决了office在pro retina中的显示问题。

 

检查并安装更新到14.2.4之后,我的retina中office的显示完全OK了.

这是office for mac team的官方声明链接link

这是网上关于升级到14.2.4之后仍然无效的解决方法的链接link2.

 

posted @ 2012-10-13 09:53 timelyxyz 阅读(225) | 评论 (0)编辑 收藏

并集:Set1 union Set2

交集:Set1 intersect Set2

posted @ 2012-10-11 21:15 timelyxyz 阅读(234) | 评论 (0)编辑 收藏

正确语句
1 update jytuser set userid=(select member.userid from member where member.id=jytuser.owner_id)

 

有2个易错点: 

1)表自关联好像行不通。我猜想会不会和查询时建立的索引更改有关。

2)这种写法postgres不支持

1 update jytuser,member set jytuser.userid=member.userid where jytuser.owner_id=jmember.id and jytuser.userid=0;

报错如下:

 

posted @ 2012-10-10 11:36 timelyxyz 阅读(197) | 评论 (0)编辑 收藏

最近在做数据同步的项目,过程中接触了spring+jdbc的开发模式(IDE: sts),然后开始使用maven管理项目。目前碰到的一个问题是在本地添加一个repository,加的是用于连接sqlserver的驱动包sqljdbc4.jar。我在很多maven仓库里都没找到这个jar,只能手动的下载来,然后添加到本地仓库里。发现这个包好像很多人没有添加成功,我在这里找到了解决方法http://claude.betancourt.us/add-microsoft-sql-jdbc-driver-to-maven/

主要步骤如下:

1. 本地下载sqljdbc4.jar

2. 解压到本地文件夹中,并找到sqljdbc4.jar路径

3. 打开命令窗口,执行以下语句(前提:先配置好maven环境变量)

1 C:\Users\nbxyz>mvn install:install-file -Dfile=e:\sqljdbc4.jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0 -Dpackaging=jar

4."BUILD SUCCESS"即添加成功



生成的pom文件如下

1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4   <modelVersion>4.0.0</modelVersion>
5   <groupId>com.microsoft.sqlserver</groupId>
6   <artifactId>sqljdbc4</artifactId>
7   <version>4.0</version>
8   <description>POM was created from install:install-file</description>
9 </project>

 

posted @ 2012-10-09 14:40 timelyxyz 阅读(305) | 评论 (0)编辑 收藏

 1     private static Map<String, Long> getPictureHeightAndWidthMap(String picUrl) {
 2         Map<String, Long> map = new HashMap();
 3         try {
 4             URL url = new URL(picUrl);
 5             HttpURLConnection connection = (HttpURLConnection) url
 6                     .openConnection();
 7             DataInputStream in = new DataInputStream(
 8                     connection.getInputStream());
 9             BufferedImage image = ImageIO.read(in);
10             map.put("w", image.getWidth() * 1L);
11             map.put("h", image.getHeight() * 1L);
12             connection.disconnect();
13             in.close();
14         } catch (IOException e) {
15             e.printStackTrace();
16         }
17         return map;
18     }
19 
20     public static Long getHeight(String picUrl) {
21         Map<String, Long> map = getPictureHeightAndWidthMap(picUrl);
22         return null == map.get("h") ? 0 : map.get("h");
23     }
24 
25     public static Long getWidth(String picUrl) {
26         Map<String, Long> map = getPictureHeightAndWidthMap(picUrl);
27         return null == map.get("w") ? 0 : map.get("w");
28     }

posted @ 2012-09-26 09:34 timelyxyz 阅读(411) | 评论 (0)编辑 收藏

Do "Show package contents" on the Eclipse.app.  
Edit Contents/Info.plist.  
Just above   

</dict>
</plist>

Place this:  

<key>NSHighResolutionCapable</key> 
<true/>

Then, log out or make a copy of the app so that OSX will notice the change.  Now, the info window will not show "Open in Low Resolution" as checked.  Launch Eclipse and enjoy your new retina awesomeness.

solution from https://bugs.eclipse.org/bugs/show_bug.cgi?id=382972

同样的方法也可以解决的软件有:Spring tool suites.

posted @ 2012-09-22 18:27 timelyxyz 阅读(321) | 评论 (0)编辑 收藏

1 首先查看PATH
命令:$PATH  
 
2 如何设置PATH
命令:echo "export PATH=xxxxxx:$PATH" >> ~/.bash_profile
解释:把"export PATH=xxxxxx:$PATH"输出打印到~/.bash_profile中去。
 
3 Unix知识补充:~/.bash_profile介绍
mac和linux终端一般用bash来进行解析。当bash在读完了整体环境变量的/etc/profile并借此调用其他配置文件后,接下来则是会读取用户自定义的个人配置文件。bash读取的文件总共有三种:
~/.bash_profile   ~/.bash_login    ~/.profile
其实bash再启动是只读上面文件的一个,而读取的顺序则是依照上面的顺序。也就是说读到bash_profile就不读后面的了,如果bash_profile不存在,后面的才能有机会。
让我们来看看bash_profile里面有什么内容:
命令:cat ~/.bash_profile 
最后重启你的终端就会有刚才设置的全局变量了。 
 【2012.02.28更新】
最直观的方法是:
cd ~
open .bash_profile
这时候就会直接用记事本程序打开这个配置文件,比在终端里那么设置要简单直观多了。
要注意一点那就是配置文件里的变量是会覆盖的,比如
export PATH=1
export PATH=2
那么后面的2会把前面的1覆盖的。

posted @ 2012-09-22 17:14 timelyxyz 阅读(474) | 评论 (0)编辑 收藏

hibernate默认的,以及网络上的主流支持left join的表关系是one-to-many的,可以使用left join fetch(需要配置lazy="true" fetch="select"),也可以使用Criteria或者CriteriaQuery(link1 link2)来进行查询。

 

对于many-to-one,首先我们先建两个model:

 

@Entity
public class ClassOne {
public String id;
public boolean isDeleted;  
}

@Entity

public class ClassTwo {
public String id; 
@ManyToOne
public ClassOne classOne; // 父表
public boolean isDeleted;  
}

 目前有两个需求:

 

(1)select a.id,b.id from ClassTwo as b left join b.classOne as a;【正确,获取到了所有ClassOne表的数据项】

(2)select a.id,count(b.id) from ClassTwo as b left join b.classOne as a where a.isDeleted=false and b.isDeleted=false group by a.id;【count结果中把0的滤去了,没达到我的需求】 

对于第二种,目前我还没找到具体的解决方法,仍需研究。 

 

posted @ 2012-09-18 13:47 timelyxyz 阅读(196) | 评论 (0)编辑 收藏

hi

outer-join     fetch     lazy         主键表class     检索策略         检索方式
true/false/auto     select     false         true/false     立即检索(n+1次查询)     所有
-         -     no-proxy/proxy     true         延迟检索         所有
-         -     -         false         立即检索(n+1次查询)     所有
-         join     false         true/false     inner join         QBC,get()/load()
-         -     -         -         立即检索(n+1次查询)     HQL,NativeSQL
-         join     no-proxy/proxy     false         inner join         QBC,get()/load()
-         -     -         -         立即检索(n+1次查询)     HQL,NativeSQL
-         -     -         true         inner join         QBC,get()/load()
-         -     -         -         延迟检索




String hql = "select t,count(tp) from ContentTag_Post as tp     left join fetch tp.tag as t"
    + " where tp.tag=t and t.owner.id=? "
    + " and tp.isDeleted=false and t.isDeleted=false "
    + " group by t order by t.createTime desc ";


        String hql = "select t,count(tp) from ContentTag as t left join ContentTag_Post as tp "
                + " where t.owner.id=? and t=tp.tag "
                + " and t.isDeleted=false and tp.isDeleted=false "
                + " group by t order by t.createTime desc ";

 Path expected for join!
2012-08-22 12:47:37 [ERROR]  Invalid path: 'tp.tag'
right-hand operand of a binary operator was null
<AST>:0:0: unexpected end of subtree
left-hand operand of a binary operator was null


select查询 join查询

@LazyToOne用法
http://docs.jboss.org/hibernate/annotations/3.4/reference/zh_cn/html/entity.html
Java中的transient,volatile和strictfp关键字
http://www.iteye.com/topic/52957
transient
  Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的


class A implements Serializable {
 private String name;
 transient private String address;
}

那么你在串行化(IO流等)A类时 给它的name和address属性赋值,那么你在提取A时,拿到了name属性,但是却拿不到address属性。




lazy是延时的意思,如果lazy=true,那么就是说数据库中关联子表的信息在hibernate容器启动的时候不会加载,而是在你真正的访问到字表非标识字段的时候,才会去加载。
反之,如果lazy=false的话,就是说,子表的信息会同主表信息同时加载。
一般用只有完全用到子表信息的时候,才会lazy=false

join 查询的时候,是用以条语句查处所有记录,包括关联表记录,select查出的是N+1条记录,两个都是差不多的,但是如果用了lazy=true,延迟加载的话,select在查询时只会查出主表记录,也就是1,如果其他地方也用到了数据,此时就会自动在执行查询,查出N,可以降低内存消耗 .还有,hibernate是的session是轻量级的,创建和销毁都不花很多资源,查询数据也很快,这里fetch主要起这个作用    

Path expected for join! unexpected end of subtree

posted @ 2012-09-04 10:55 timelyxyz 阅读(143) | 评论 (0)编辑 收藏

使用条件如下:

a left join  b

a must be b's parent

posted @ 2012-07-24 11:37 timelyxyz 阅读(385) | 评论 (0)编辑 收藏

突然抛了一个concurrentModificationException错误,Iterator的一个基本概念没有掌握导致的这个错误,就是在Iterator的实现类。比如Hashtable里面的内部类
 private class Enumerator<T> implements Enumeration<T>, Iterator<T>

会在next,或者remove的时候检查当前集合是否会在修改状态,如果是的话,就会抛出 ConcurrentModificationException,而他自己remove则是使用了同步的方法,而且同步了modCount;expectedModCount;

 1 public T next() {
 2      if (modCount != expectedModCount)
 3          throw new ConcurrentModificationException();
 4      return nextElement();
 5  }
 6 
 7 
 8 public void remove() {
 9      if (!iterator)
10         throw new UnsupportedOperationException();
11      if (lastReturned == null)
12         throw new IllegalStateException("Hashtable Enumerator");
13      if (modCount != expectedModCount)
14         throw new ConcurrentModificationException();
15 
16      synchronized(Hashtable.this) {
17         Entry[] tab = Hashtable.this.table;
18         int index = (lastReturned.hash & 0x7FFFFFFF) % tab.length;
19 
20      for (Entry<K,V> e = tab[index], prev = null; e != null; prev = e, e = e.next) {
22       if (e == lastReturned) {
23          modCount++;
24          expectedModCount++;
25          if (prev == null)
26             tab[index] = e.next;
27          else
28             prev.next = e.next;
29          count--;
30          lastReturned = null;
31          return;
32       }
33      }
34      throw new ConcurrentModificationException();
35      }
36     }
37     }
而自己在next的同时,修改了这个集合,导致了这个错误的出现

 

在Map或者Collection的时候,不要用它们的API直接修改集合的内容,如果要修改可以用Iterator的remove()方法,例如:
1 public void setReparation( Reparation reparation ) {
2         for (Iterator it = this.reparations.iterator();it.hasNext();){    //reparations为Collection
3             Reparation repa = (Reparation)it.next();
4             if (repa.getId() == reparation.getId()){
5                 this.reparations.remove(repa);
6                 this.reparations.add(reparation);
7             }
8         }
9    }

 

如上写会在运行期报ConcurrentModificationException,可以如下修改:

 

 1  public void setReparation( Reparation reparation ) {
 2         boolean flag = false;
 3         for (Iterator it = this.reparations.iterator();it.hasNext();){    //reparations为Collection
 4             Reparation repa = (Reparation)it.next();
 5             if (repa.getId() == reparation.getId()){
 6                 it.remove();
 7                 flag = true;
 8                 break;
 9             }
10         }
11         if(flag){
12           this.reparations.add(reparation);
13         }
14     }

 

 

原文摘自 alreal 

 

posted @ 2012-07-17 17:01 timelyxyz 阅读(109) | 评论 (0)编辑 收藏

API语法:

File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
public static final String separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar
public static final char separatorChar
与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 值的第一个字符。在 UNIX 系统上,此字段的值为 '/';在 Microsoft Windows 系统上,它为 '\\'

注意:

路径名字符串与抽象路径名之间的转换与系统有关。将抽象路径名转换为路径名字符串时,每个名称与下一个名称之间用一个默认分隔符 隔开。默认名称分隔符由系统属性 file.separator 定义,可通过此类的公共静态字段 separatorseparatorChar 使其可用。将路径名字符串转换为抽象路径名时,可以使用默认名称分隔符或者底层系统支持的任何其他名称分隔符来分隔其中的名称。

 

例如,我希望的文件绝对路径是E:\dev\workspace\iclass_web/conf/filterconfig.xml(计作myPath),有两种创建File的形式:

1)new File(myPath)不会报错;

2)new File("E:\dev\workspace\iclass_web/conf/filterconfig.xm")报错,应修改为new File("E:\\dev\\workspace\\iclass_web/conf/filterconfig.xml"

 我的系统是windows32位,io.File的一个字段FileSystem是一个抽象类,FileSystem被一个Win32FileSystem类继承,从而实现里面的public abstract String normalize(String path);方法。

 Win32FileSystem部分源码如下:

 1 private final char slash;  2     private final char altSlash;  3     private final char semicolon;  4
 5     public Win32FileSystem() {  6     slash = ((String) AccessController.doPrivileged(  7               new GetPropertyAction("file.separator"))).charAt(0);  8     semicolon = ((String) AccessController.doPrivileged(  9               new GetPropertyAction("path.separator"))).charAt(0); 10     altSlash = (this.slash == '\\') ? '/' : '\\'; 11     } 12 13     private boolean isSlash(char c) { 14     return (c == '\\') || (c == '/'); 15     } 16 17     private boolean isLetter(char c) { 18     return ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')); 19     } 20 21     private String slashify(String p) { 22     if ((p.length() > 0) && (p.charAt(0) != slash)) return slash + p; 23     else return p; 24     } 25    26     /* Check that the given pathname is normal.  If not, invoke the real 27        normalizer on the part of the pathname that requires normalization. 28        This way we iterate through the whole pathname string only once. */ 29     public String normalize(String path) { 30     int n = path.length(); 31     char slash = this.slash; 32     char altSlash = this.altSlash; 33     char prev = 0; 34     for (int i = 0; i < n; i++) { 35         char c = path.charAt(i); 36         if (c == altSlash) 37         return normalize(path, n, (prev == slash) ? i - 1 : i); 38         if ((c == slash) && (prev == slash) && (i > 1)) 39         return normalize(path, n, i - 1); 40         if ((c == ':') && (i > 1)) 41         return normalize(path, n, 0); 42         prev = c; 43     } 44     if (prev == slash) return normalize(path, n, n - 1); 45     return path; 46     }

 

posted @ 2012-07-10 17:12 timelyxyz 阅读(152) | 评论 (0)编辑 收藏

Hibernate中使用COUNT DISTINCT关键字: Hibernate

在Hibernate中, 计算某列非重复记录的总数, 使用COUNT + DISTINCT

在MySQL中,可以使用

sql 代码
  1. select COUNT(DISTINCT(name)) from products  

但在Hibernate中却不能用如下格式

  1. select COUNT(DISTINCT(name)) from ProductDTO  

需要把里面的括号去掉, 改成

  1. select COUNT(DISTINCT name ) from ProductDTO  

在MySQL中也可以使用这种样式.

posted @ 2012-06-28 13:24 timelyxyz 阅读(112) | 评论 (0)编辑 收藏

报错现象

Oops: JPAQueryException
An unexpected error occured caused by exception JPAQueryException: Error while executing query select t from TurnedIn t, Notification n  where n.itemId=t.id and n.type=? and n.receiver.id=? and n.isDeleted=false group by t order by t.createTime desc: org.hibernate.type.SerializationException: could not deserialize
...
Caused by: java.io.InvalidClassException: models.member.Member; local class incompatible: stream classdesc serialVersionUID = 8996579512119659486, local class serialVersionUID = -7513555048418418149

异常原因

本地和远程的member序列化后的serialVersionUID不

解决方法

将本地的序列化的类中的版本号(serialVersionUID )改成和远程中一样,在本地的序列化类里的private static final long serialVersionUID =  改成远程的就行了,如果没有的话就加上这句。

 

关于“org.hibernate.type.SerializationException: could not deserialize”,我查了很多的资料,大概有以下几个原因:

1.该类的序列版本号与从流中读取的类描述符的版本号不匹配(jdk版本更换会造成这个问题)

2.该类包含未知数据类型(hibernate配置文件中未指定数据类型)

3.该类没有可访问的无参数构造方法


 

 

 

posted @ 2012-06-26 09:51 timelyxyz 阅读(1083) | 评论 (0)编辑 收藏

pgSql

语法 to_number(text, text)

例子 select to_number(trim(both 'ibs' from classname), '999999') as cn from bbs order by cn   /*trim(both 'ibs' from classname)去除classname字段中的'ibs'字符*/

mySql

语法 str*1 / str+1 / -str  /*str为varchar的数字,此处不一定是1,只要是数字即可*/

hql

语法 to_number(text, text)

 

例子 select b from BBS b where b.isDeleted=false order by to_number(trim(both 'ibs' from b.className), '999999')


 

 

pgSql数据类型格式化函数 

posted @ 2012-06-14 15:43 timelyxyz 阅读(580) | 评论 (0)编辑 收藏

order by isTop desc


 

默认false在前;按desc,true在前

posted @ 2012-06-13 15:00 timelyxyz 阅读(720) | 评论 (0)编辑 收藏

      在push之前有时候会不放心是不是忘记加某些文件,或者是不是多删了个什么东西,这时候希望能够看看上次commit都做了些什么。

一开始想到的是用git diff,但是git diff用于当前修改尚未commit的时候较为方便,一旦commit后,需要指定上次节点的名称(一个hash值),不方便。这种时候用git log更合适,因为commit的内容会以log来记录。

下面记录几个常用的情境以及对应的命令。

仅仅想看最近谁有提交,以及提交的描述

对应命令 git log

显示Sample

 

commit 6305aa81a265f9316b606d3564521c43f0d6c9a3
Author: XXX
Date:   Thu Nov 3 11:38:15 2011 +0800

    fill author information in the head of files and format some code

commit 8e8a4a96e134dab8f045937efee35bd710006946
Author: XXX
Date:   Thu Nov 3 04:05:34 2011 +0800

    user management is mostly complete

    details:
    add support for account disable/enable
    rewrite most related views to suit the above need
    provide two decorators for access control (see README)
    fixed many errors in Milestone 1

commit 2870cd564371d8ad043d0da426a5770d36412421
Author: XXX
Date:   Mon Oct 17 20:19:04 2011 -0400

    fix the bug of get_ori_url_from_shorturl().

commit b6cdd881a19ecaff838d5825c3a6b7058fdd498a
Author: XXX
Date:   Mon Oct 17 20:17:37 2011 -0400

    fix the bug of get_article_from_short_url.

仅仅想看最后一次的提交

对应命令参数 -n 1

显示Sample

commit 6305aa81a265f9316b606d3564521c43f0d6c9a3
Author: XXX
Date: Thu Nov 3 11:38:15 2011 +0800

fill author information in the head of files and format some code

想看到最近一次提交所有更改过的文件

对应命令 git log -n 1 --stat

显示Sample

commit 6305aa81a265f9316b606d3564521c43f0d6c9a3
Author: XXX
Date:   Thu Nov 3 11:38:15 2011 +0800

    fill author information in the head of files and format some code

Site/accounts/decorators.py                        |    2 +-
Site/accounts/forms.py                             |    1 +
Site/accounts/models.py                            |    1 +
Site/accounts/readme                               |    3 ++-
Site/accounts/templates/account_activate.html      |    1 +
Site/accounts/templates/account_disabled.html      |    1 +

28 files changed, 37 insertions(+), 8 deletions(-)

想看到最近一次提交所有更改的细节

对应命令 git log -n 1 -p

显示Sample

commit 6305aa81a265f9316b606d3564521c43f0d6c9a3
Author: XXX
Date:   Thu Nov 3 11:38:15 2011 +0800

    fill author information in the head of files and format some code

diff --git a/Site/accounts/decorators.py b/Site/accounts/decorators.py
index 22522bc..a6bb440 100755
--- a/Site/accounts/decorators.py
+++ b/Site/accounts/decorators.py
@@ -1,9 +1,9 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+# author: Rex Nov. 3, 2011
from functools import wraps
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
-from django.utils.decorators import available_attrs
from Site.accounts.models import UserProfile

def login_required(view_func):
diff --git a/Site/accounts/forms.py b/Site/accounts/forms.py
index 016710b..778d92a 100755
--- a/Site/accounts/forms.py
+++ b/Site/accounts/forms.py
@@ -1,5 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+# author: Rex Nov. 3, 201

有了这几条命令,基本上对于想看最近更改的情境就可以应付过去了。最后一条并不很常用,如果有visual的工具可能更直观些。

 

原文转自git使用点滴

 

posted @ 2012-06-13 12:24 timelyxyz 阅读(212) | 评论 (0)编辑 收藏

      Onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过window.onunload 来指定或者在<body>里指定。区别在于onbeforeunload在onunload之前执行,它还可以阻止onunload的执行。

    Onbeforeunload也是在页面刷新或关闭时调用,Onbeforeunload是正要去服务器读取新的页面时调用,此时还没开始读取;而 onunload则已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调用。Onunload是无法阻止页面的更新和关闭的。而 Onbeforeunload 可以做到。曾经做一个考试系统,涉及到防止用户半途退出考试(有意或者无意),代码如下:

 

<body onbeforeunload=" checkLeave()">

 

<script>
function checkLeave(){
    event.returnValue="确定放弃考试?(考试作废,不记录成绩)";
}
</script>

 

 

这样可以让用户确认是否要退出考场,其实BLOGJAVA在用户编写BLOG时,如果不保存而跳转到其他页面,也会有一个确认的提示(防止误操作),也是用到Onbeforeunload。

   另外还可以用来在页面关闭的时候关闭session,代码如下(注:用window.screenLeft > 10000 来区分关闭和刷新操作):

<body onbeforeunload=" closeSession()">

 

<script>
function closeSession (){
    //关闭(刷新的时候不关闭Session)
    if(window.screenLeft>10000){
       //关闭Session的操作(可以运用AJAX)
    }
}
</script>

 

 

 

文章摘自 blogJava

 

posted @ 2012-06-11 16:11 timelyxyz 阅读(120) | 评论 (0)编辑 收藏

问题描述:firefox下js中动态组装select时指定option的selected属性的失效

 

有问题的代码如下:

 1                         // 加载select列表
 2                         var teaOption ='', ownerSel = $("ownerSel");
 3                         for(var i = 0; i < teaList.length; i ++){
 4                             var teacher = teaList[i];
 5                             if(teacher.isDeleted === false){
 6                                 var tid = teacher.id, tName = teacher.fullName, newOption;
 7                                 var flag = ((tid === formerOwnerId) ? 'selected="selected"' : '');
 9                                 teaOption += '<option value="'+tid+'" '+ flag +'>'+ tName +'</option>';
10                             }
11                         }
12                         ownerSel.html(teaOption);

 此时selected属性无效,ff中的select显示的是option列表的最后一个。

原因貌似是这样子:
selected这个属性本身是没有错的,你在页面开始加载的前写好,然后浏览器加载的时候就会读取这个dom,然后有selected这个效果。
但是通过js动态组装的select的html代码,在ie下我刚刚试了下可行(我刚刚失败的原因是三目运算符处少加了一个括号);firefox下,在请求加载的同时加载dom元素,但是ff内核可能是为了追求速度,而省略了一些dom的属性的加载,导致了selected这个属性的失效。

解决方法(我用的是mootools):在加载的时候将option元素通过如下解决

 1                         // 加载select列表
 2                         var ownerSel = $("ownerSel");
 3                         for(var i = 0; i < teaList.length; i ++){
 4                             var teacher = teaList[i];
 5                             if(teacher.isDeleted === false){
 6                                 var tid = teacher.id, tName = teacher.fullName, newOption;
 7                                 if(tid === formerOwnerId)
 8                                     newOption = new Element('option', {"value" : tid, "selected" : "selected"}).html(tName);
 9                                 else
10                                     newOption = new Element('option', {"value" : tid}).html(tName);
11                                 ownerSel.grab(newOption); // 将新的element插入到select中
12                             }
13                         }

 

posted @ 2012-06-07 08:34 timelyxyz 阅读(1557) | 评论 (0)编辑 收藏

错误 org.hibernate.HibernateException: ordinal parameter mismatch 。

我的错误是未将hql语句设置参数时的占位符去掉(粗糙流了下- -///)

1 hql += " and bbs.id=? " + bbs.id;

 

 

在这之前网上发现的另一种错误也很值得注意:在数据表中用了关键字“call” 作为数据字段,所以产生了这个问题。Hibernate报错如下:

 

 org.hibernate.HibernateException: ordinal parameter mismatch
 at org.hibernate.engine.query.HQLQueryPlan.buildParameterMetadata(HQLQueryPlan.java:225)
 at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:95)
 at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
 at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
 at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
 at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
 at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
  ......
 

 

 出错的原因是在org.hibernate.engine.query.ParameterParser类中有下列一段代码

 

1 public static void parse(String sqlString, Recognizer recognizer) throws QueryException{
2     boolean hasMainOutputParameter = sqlString.indexOf( "call" ) > 0 &&
3                                    sqlString.indexOf( "?" ) < sqlString.indexOf( "call" ) &&
4                                    sqlString.indexOf( "=" ) < sqlString.indexOf( "call" );
5     ......
6 }

 


我们都知道hibernate3可以调用存储过程或函数,但是有一定的限制(具体可以查看hibernate官方手册)。
据我分析这段代码应该是用来分析字符串是否是调用存储过程或函数的语句。
解决方法:
1.不要在表或列中,出现"call"字样
2.用Criteria来代替hql语句

 

posted @ 2012-06-06 13:20 timelyxyz 阅读(329) | 评论 (0)编辑 收藏

String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结。

在java中有3个类来负责字符的操作。

1.Character 是进行单个字符操作的,

2.String 对一串字符进行操作。不可变类。

3.StringBuffer 也是对一串字符进行操作,但是可变类。

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");

字符串连接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.

看看以下代码:
将26个英文字母重复加了5000次,

  String tempstr = "abcdefghijklmnopqrstuvwxyz";
  int times = 5000;
  long lstart1 = System.currentTimeMillis();
  String str = "";
  for (int i = 0; i < times; i++) {
  str += tempstr;
  }
  long lend1 = System.currentTimeMillis();
  long time = (lend1 - lstart1);
  System.out.println(time);
可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。
也就是46秒。
我们再看看以下代码

  String tempstr = "abcdefghijklmnopqrstuvwxyz";
  int times = 5000;
  long lstart2 = System.currentTimeMillis();
  StringBuffer sb = new StringBuffer();
  for (int i = 0; i < times; i++) {
  sb.append(tempstr);
  }
  long lend2 = System.currentTimeMillis();
  long time2 = (lend2 - lstart2);
  System.out.println(time2);
得到的结果为 16 有时还是 0
所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。

根据上面所说:

str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();

所以str += "here";可以等同于

StringBuffer sb = new StringBuffer(str);

sb.append("here");

str = sb.toString();

所以上面直接利用"+"来连接String的代码可以基本等同于以下代码

  String tempstr = "abcdefghijklmnopqrstuvwxyz";
  int times = 5000;
  long lstart2 = System.currentTimeMillis();
  String str = "";
  for (int i = 0; i < times; i++) {
  StringBuffer sb = new StringBuffer(str);
  sb.append(tempstr);
  str = sb.toString();
  }
  long lend2 = System.currentTimeMillis();
  long time2 = (lend2 - lstart2);
  System.out.println(time2);
平均执行时间为46922左右,也就是46秒。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yirentianran/archive/2008/09/03/2871417.aspx

StringBuffer维护了一个大小固定的字符串缓冲区,当字符串长度超过StringBuffer大小时会自动增加,主要使用Insert和append方法,对于运行期要进行字符串的组装操作推荐使用,

  StringBuilder: jdk5以后有个和StringBuffer等价的StringBuider,区别在于StringBuffer是线程安全的,StringBuilder是单线程的,不提供同步,理论上效率更高。

  String是系统内置类型,而且是final的,定义一个字符串会产生一个实例和一个对该实例地址的引用。

  如果在编译期间定义的字符串,例如 :

  String a = "name";
  a += "is";
  a += "good";

  尽管这种方法是不被推荐的,但在编译期,编译器会对该代码进行优化,所以还是可以理解为:String a = "name is good";而如果在此时采用StringBuffer,反而会推迟到运行期才会被处理,相比之下,反而会比StringBuffer效率更高,灵活运 用。
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
 String S1 = “This is only a” + “ simple” + “test”; 其实就是:
 String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做

在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。 append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder 一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
通过非官方试验测试,StringBuilder和StringBuffer的测试总结如下:

1. 为了获得更好的性能,在构造 StirngBuffer 或 StirngBuilder 时应尽可能指定它的容量。当然,如果你操作的字符串长度不超过 16 个字符就不用了。

2. 相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因 此:除非你能确定你的系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,否则还是用 StringBuffer 吧 J

3. 用好现有的类比引入新的类更重要。很多程序员在使用 StringBuffer 时是不指定其容量的(至少我见到的情况是这样),如果这样的习惯带入 StringBuilder 的使用中,你将只能获得 10 %左右的性能提升(不要忘了,你可要冒多线程的风险噢);但如果你使用指定容量的 StringBuffer ,你将马上获得 45% 左右的性能提升,甚至比不使用指定容量的 StirngBuilder 都快 30% 左右。

posted @ 2012-06-05 17:04 timelyxyz 阅读(117) | 评论 (0)编辑 收藏