您的位置:首页 > 其它

创业过程中的63个技术问题

2015-05-03 00:00 537 查看
1.Eclipse Marketplace搜索Hibernate,比较靠前的位置有“Hibernate Tools”,使用代码自动生成,提高开发效率!

需要选择正确的版本,我用的是Indigo!

Eclipse插件:Hibernate Tools安装之后,没有找到自动生成代码的菜单。

只好在Myeclipse下使用,然后再拷贝到工程中。

遇到一个问题,创建工程时,需要先“增加对Hibernate的支持”,然后才能生成代码,要不然无法选择SrcFolder!

2.把Java Web项目部署到Tomcat的根目录。

项目--右键--属性--项目属性里面找到一个 web project setttings选项菜单,里面有一个context root可以设置``````

3.

<!-- Properties文件读取配置,*.properties -->

<context:property-placeholder location="classpath*:*.properties" />

<!-- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations"> <list> <value>classpath:*.properties</value>

</list> </property> </bean> -->

<!-- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations"> <list> <value>classpath*:*.properties</value>

</list> </property> </bean> -->

4.SpringMVC后端只能接收到get方式发送的请求参数,无法接收到post。

@RequestParam

@RequestBody

5.调整iframe高度

<iframe id="frm_footer" name="frm" src="<s:url value='/common/footer.jsp'/> "

frameborder="0" height="750px" scrolling="no" width="100%" style="height:750px;"></iframe>

ie8和Firefox怎么都不支持iframe的height字段???

通过style="height:700px"设置有效。

6.$.ajax({

url : this.dataSource,

data : this.params && JSON.stringify(this.params),

contentType : "application/json",

type : this.method || 'POST',

dataType : 'json',

context : this,

success : function(data){fill(that, data);},

error : this.onerror

});

设置了 contentType : "application/json",使用SpringMVC的@RequestBody才能接收到参数,而不是@RequestParam。

不设置这个参数,使用@RequestParam。

7.直接使用addEntity(java.util.Map.class)

使用的原生sql查询

SQLQuery sqlQuery = doCreateSQLQuery(sql);

if (clazz != null) {

sqlQuery.addEntity(clazz);

}

无法查询

通过下面的方式是可以的sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

这种方法为什么不行呢??

sqlQuery.setResultTransformer(Transformers.aliasToBean(clazz));

String sql = "select count(*) as count,create_time as createTime from " + tableName

+ " group by create_time order by create_time desc";

return getDao().sqlList(sql, Fans.class);

public class Fans {

private Integer count;//必须定义为“BigInteger”,否则会报错(太难发现了啊)

private Date createTime;



org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of cn.coderzone.admin.Fans.count

at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:128)

at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:91)

at org.hibernate.hql.HolderInstantiator.instantiate(HolderInstantiator.java:96)

at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.java:361)

at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)

at org.hibernate.loader.Loader.list(Loader.java:2271)

at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)

at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)

at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)

at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)

at cn.coderzone.admin.dao.base.BaseHqlDao.doQuery(BaseHqlDao.java:280)

at cn.coderzone.admin.dao.base.BaseDao.sqlList(BaseDao.java:23)

at cn.coderzone.admin.service.BaseService.countByDay(BaseService.java:117)

at cn.coderzone.admin.service.BaseService$$FastClassByCGLIB$$55a6ed4c.invoke(<generated>)

at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)

at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)

at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)

at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)

at cn.coderzone.admin.service.ArticleService$$EnhancerByCGLIB$$39dcde90.countByDay(<generated>)

at cn.coderzone.admin.test.service.ArticleServiceTest.testArticleCountByDay(ArticleServiceTest.java:33)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:601)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)

at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)

at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)

at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)

at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)

at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)

at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)

at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)

at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)

at org.junit.runners.ParentRunner.run(ParentRunner.java:300)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Caused by: java.lang.IllegalArgumentException: argument type mismatch

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:601)

at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:66)

... 51 more

8.HQL语句无法执行更新,但是可以执行查询!!

update Article set status=:status and updateTime=:updateTime where id=:id

Spring和Hibernate注解、事务等配置项,顺序不对,导致无法执行,但是具体为啥不对,却不知道。

又一个坑爹的问题!

9.在Hibernate中可以利用@DynamicInsert和@DynamicUpdate生成动态SQL语句,即在插入和修改数据的时候,语句中只包括要插入或者修改的字段。

10.为了减少代码重复率,st-grid默认按照id降序。

但是有的统计页面,根本不存在id字段,必须手动指定排序字段,“覆盖默认的”!

这种统计页面必须指定“排序字段”,挺奇怪的。

最终改为,在前端指定排序字段。

11.JavaScript写的代码,经常会遇到浏览器兼容性问题。

还是应该用Jquery等第三方框架比较合适!

12.JQuery与JavaScript。

a.2个相同的jquery对象,直接使用 == ,返回false。

用attr('id')比较,比较合适。

ul.children('li').each(function(i){

if($(this).attr('id')==id){

//这里的this应该也是JavaScript对象,使用$之后是Jquery对象

$(this).css("background-color","black");

}else{

}

});

b.区分Jquery对象和JavaScript对象

var liList=ul.children('li');

for ( var i = 0; i < liList.length; i++) {

//导致liList[i]元素是JavaScript对象,而不是jquery对象,没有attr方法

var li = $(liList[i]);

}

13.联表查询时参数的冲突应该由前端来设置!!!(前端就和业务紧密相联)

14.64位JDK,64位Eclipse
http://aquilo.diandian.com/post/2012-05-27/21832516
15.nodejs的文件编码为GBK,导致Express接收的参数为乱码。

16.mysql的配置,charset设置为“utf8”会报错。

nodejs中的mysql连接参数中,编码参数与 Java中的mysql不一样。

“ charset : The charset for the connection. (Default: 'UTF8_GENERAL_CI' . Value needs to be all in upper case letters!)”

mysqldb:{

username:"root",

password:"lw198962",

database:"itfriend",

host:"192.168.0.12",

port:3306

},
https://github.com/felixge/node-mysql
17.nodejs运行过程中,不能使用SmartSVN等SVN软件进行更新,会报错。

18.有的政府网站非常坑爹,注册表单的验证码区分大小写。

19.百度加速乐真心不给力

使用之后,域名经常无法解析。

阿里云频繁发出 监控报警,1天要收到好几条短信。

“您的域名无法访问,您的域名恢复了”。

烦死了!

20.update article_category set name =:name, update_time =now() where id=:id

错误的写法:update article_category set name =:name and update_time =now() where id=:id

让人蛋疼的是,上面的update方法不会报错,只是没有更新成功而已

21.JS中,0也为false。

期待结果:如果status的值为null,或者status未定义,修改status的值。

//有问题

var data={status:0}; data.status=data.status||1;

//正确

var data={}; (data.status== null)&&(data.status=1)

22.nodejs 查询方法,至少返回{}数组,增加方法返回insertId

23.Nodejs批量插入

insert into article_tag(name)

values("tag"),("tag2");

拼接values值

MySQL支持,其它数据库不一定支持“非标准”SQL语法。

async each

tags =[{userId:article.userId,articleId:result.insertId,name:"tag5"}];

async.each(tags, ArticleTagDao.add, function(err){

// if any of the saves produced an error, err would equal that error

});

24.级联查询1篇文章的“评论数”、“赞数”、“踩数”

select * from

(select a.*,count(ac.article_id) as commentCount from article a left join article_comment ac

on a.id = ac.article_id

where a.user_id=1

group by a.id)

A

left join

(select a.id,count(am.type) as likeMarkCount from article a left join article_mark am on a.id = am.article_id

where type = 1 group by a.id)

B on A.id = B.id

left join

(select a.id,count(am.type) as unlikeMarkCount from article a left join article_mark am on a.id = am.article_id

where type = 2 group by a.id)

C on C.id = A.id

limit 0,10

25.偷懒,不记住URL,总指望着复制-粘贴,QQ发送

26.sql-count的 indexOf(' from '),from的左右必须有1个空格。

var fromIndex = sql.indexOf(' from ');

var countSql = 'select count(*) as totalCount' + sql.substring(fromIndex);

普通的sql语句

var sql="select * from article";一定可以

子查询sql右边,可以不要空格,为了使用Pager组件,增加空格

var sql ="select * from(select id,title,create_time from topic) A ";

27.app.use(express.session({

cookie:{

maxAge : 2*60*1000(2分钟,而不是20分钟,cookie的单位是毫秒)

},

store:redisStore,

secret:settings.cookieSecret

}));

28.result为[]空数组,result[0]不会报错,但是在使用result[0].password会报错

UserDao.getByEmailAndAccount(data,function(err,result){

console.log(JSON.stringify(result));

if(err) return callback(err);

callback(err,result[0]);

-------------优化工作-------

查询有必要查询的字段,而不是select *

var finalResult=result[0] || {};(null值判断)

var db = null;

var dbConfig = settings.mongodb;

var uri = 'mongodb://' + dbConfig.host + ':' + dbConfig.port + '/' + dbConfig.database

db = mongoose.createConnection(uri,{server:{poolSize:dbConfig.poolSize}});

db.on('error',function(err){

winston.error("mongodb connection,error");

});

(使用连接池和不使用连接池,绑定事件的对象不一样,不使用连接池的方式mongoose.connection.on('error',fun)

Mongodb防火墙,导致无法远程访问

29.JS只有函数作用域,没有块作用域!!!

变量重名,容易被“覆盖”!

30.routes里,不应该直接用 字符串保存json,而是用var json={},而不是 var json="";

jquery的post“很慢”,局域网发送需要1125ms,使用自己写的JS封装的POST组件,只需要215ms。

31.立即返回结果。消息通知继续执行,不需要等待其返回。

exports.add=function(data,callback){

MessageDao.add(data,function(err,result){

callback && callback(err,result);

if(err)return;

var notify=[];

//通知空间作者

if(data.fromUserId != data.toUserId){

var notifyUser={fromUserId:data.fromUserId,toUserId:data.toUserId,type:NotifyType.MESSAGE,resourceId:data.topId,title:data.title};

notify.push(notifyUser);

}

//通知被回复的人

if(data.refUserId && data.refUserId != -1 && data.refUserId != data.fromUserId){

var notifyRefUser={fromUserId:data.fromUserId,toUserId:data.refUserId,type:NotifyType.MESSAGE_COMMENT,resourceId:data.topId,title:data.title};

notify.push(notifyRefUser);

}

NotifyDao.batchAdd(notify);

});

};

32.重复的get函数,下面的会覆盖上面的。

33. //1.统计积分

caculateScore(function(err,scoreArray){

//new Date() == 2014-04-25 09:11:00 765512 (带上了毫秒)

var currentTime = DateUtils.toYMDHDS(new Date());

//2.保存新的积分

ScoreUpdate.insertScore(scoreArray,function(err,result){

var deleteOldScoreSql ="update user_score_grade set status =:status,delete_time = now() where create_time < :currentTime";

var data ={status:Status.DELETED,currentTime:currentTime};

//3.删除旧的积分

BaseDao.queryWithTransaction(deleteOldScoreSql,data,function(err,result){

callback&&callback(err,result);

});

});

});

当前时间:2014-04-25 09:11:00 765512

新插入积分的时间是:currentTime 2014-04-25 09:11:00

需要删除的积分时间:create_time 小于 currentTime

insertScore方法执行的时候,create_time应该已经大于currentTime,不会被删除。

由于insertScore的时间是 2014-04-25 09:11:00(如果带上毫秒,应该是2014-04-25 09:11:00 800)

没有毫秒,所以 2014-04-25 09:11:00 <2014-04-25 09:11:00 765

这个问题,在数据量很小,执行速度非常快的时候,会出现。

解决方法:时间格式统一,都不要毫秒。

34. 数据库id起始大小

alter table zone AUTO_INCREMENT=100001;

35. Bootstrap的Modal对话框组件,与form一起使用的时候,按Enter会导致页面刷新,Bug!

36. 互动百科PHP兼容性
http://kaiyuan.hudong.com/bbs/viewthread.php?tid=116485&extra=&page=1
control\index.php文件的开头,找到类似的代码,修改对应的代码为描红部分,即:

将$this->base( & $get, &$post); 修改为$this->base( $get,$post);

37.延迟初始化和初始化此次,节省时间!

JavaWeb开发,Spring框架,默认是@Service和@Repository默认都是单例并且立即初始化。

但是我发现构造函数执行了2次。

根据我的理解,如果ArticleService不使用接口的方式,那么需要CGLIB的库,生成1个增强的类。

因此,执行2次。

如果有接口ArticleService implements IArticleService;

@Autowired

private IArticleService articleService;

没有接口

@Autowired

private ArticleService articleService;

@Service

@Lazy(true)

public class ArticleService {}

使用@Lazy(true)可以延迟初始化1个类。

Java程序,尤其是Spring最麻烦的地方是,系统启动时间实在是太长了,Tomcat部署初始化之类的过程,至少要10s。

平均在20s。

而node.js只需要2s。

延迟初始化的坏处是,系统启动的时候,有的错误不能及时发现。

Dao无论是否延迟初始化,都初始化了1次,难道是Dao,无论是否使用接口,都不需要使用CGLIB增强。

如果所有的Service都使用了延迟初始化,Dao不设置,那么使用@Repository标记的Dao,还是会初始化,

除非也使用@Lazy(true)标记。

Service和Dao全部使用延迟初始化后,发现启动时间减小了不到1s,唉,大部分时间还是花在了部署上了。

还是去掉@Lazy(true),只当是研究1个问题了。

38. JQuery根据元素的class选择至少有2种方法

$("div.page-node").remove();

$("div[class='page-node show']").remove();

<div class="page-node show"></div>

使用div[class='page-node show'],必须是“全等”,如果只是class='page-node',是选择不到的。

39. Mysql备份。

以前,使用Windows系统,每次更换数据库,都是mysqldump数据库成sql文件备份,

现在其实有更好的方法,把Mysql的数据目录,迁移到D盘,下次更换数据库,只需要更换mysql数据库的datadir配置就好了。

40.Spring中的一些提醒

私有方法,没有执行sql语句,事务没有起作用。

下面这篇总结很好。

参考资料:http://hi.baidu.com/coolwork/item/593855c6131a0bcf994aa0ff

41.Mysql无法启动或者经常挂。

阿里云服务器512MB内存(为了省钱,内存很低)

默认情况下,mysql的max_connections是150,导致需要的内存非常高。

当mysql占居内存达到80%左右的时候,会被操作系统kill。

下面是个好网站:http://www.mysqlcalculator.com/

计算mysql需要使用多少内存,真是先进呀

42.X-UA-Compatible
http://www.cnblogs.com/nidilzhang/archive/2010/01/09/1642887.html
43.textarea设置值

<textarea id="remark" style="width:100%" placeholder="写几句,介绍下自己吧" maxlength="250"><%= user.remark != null?user.remark:''%></textarea>

textarea没有value属性

Eclipse下编辑有警告,而Sublime没有。

44.QQ浏览器下-上传头像,会出现下载对话框

返回数据不能用JSON。

res.set('Content-Type', 'text/plain');

45.目录和文件取名的不同

Linux下,这是一个文件

scoreTmpFile:"/var/www/scoregrade/upload/score",

而Windows下C:/upload/score是一个目录,有个后缀就是文件了C:/upload/score.txt

47.

如果在启动warning: World-writable config file /home/mysql/my.cnf is ignored

原因:my.cnf的读取权限进行了设置,不允许World-writable(字面意思是全世界都可读写)

解决方法:

sudo chmod 644 /home/mysql/my.cnf

参考资料:http://www.cnblogs.com/ylan2009/archive/2012/02/25/2368027.html

48.Ubuntu下彻底卸载mysql

sudo apt-get autoremove --purge mysql-server-5.0

sudo apt-get remove mysql-server

sudo apt-get autoremove mysql-server

sudo apt-get remove mysql-common (非常重要)

49.

又拍云配置图片白名单:www.itfriend.cn会导致不带www访问,itfriend.cn的图片无法打开,403forbidden。

50.网上下载的Placeholder插件不给力。

/*;(function($) {

$.fn.extend({

placeholder: function() {

if ('placeholder' in document.createElement('input')) {

return this

} else {

return this.each(function() {

var that = $(this);

var thatPlaceholder = that.attr('placeholder');

if(thatPlaceholder){

that.val(thatPlaceholder).focus(function() {

if (that.val() === thatPlaceholder) {

if(that.attr('realType')=='password'){

that.attr('type','password');

}

that.val('');

}

}).blur(function() {

if (that.val().length === 0) {

that.val(thatPlaceholder);

if(that.attr('realType')=='password'){

that.attr('type','text');

}

}

});

if(that.attr('type') == 'password'){

that.attr('type','text');

that.attr('realType','password');

}

}

})

}

}

})

})(jQuery);

$("input[type=text]").placeholder();

$("input[type=password]").placeholder();

$("textarea").placeholder();*/

下面这个还不错,问题也是有的,我们进行了定制和修复。
http://www.ifrans.cn/placehoder/
51.修改头像失败

Z.getXiuXiuUploadUrl = function(){

var url= "http://localhost/data/user/modifyImg";

//一定要带www

//path = "http://www.itfriend.cn/data/user/modifyImg";

return url;

};

错误症状:如果域名中,带有www,QQ浏览器可以修改头像,chrome失败;

不带www,QQ和chrome都成功。

最终诊断出原因:"http://www.itfriend.cn/data/user/modifyImg";这个url如果不带www,

就有可能不能修改头像,出现403之类的错误。

这个可能和浏览器也存在一定的关系。

解决方案就是,这个url一定带上www,无论url的访问路径是否带了www。

52.图片无法访问。
http://www.itfriend.cn/user/fansunion/photo
fansunion小写,访问不到又拍云的图片。

FansUnion大写才行。

hname应该使用数据库中保存的user.name,而不是从url参数中解析出来的name。

53.展示html的需要xss,

展示纯文本的需要转义。

54.ueditor修改编辑器的默认字体大小

//ueditor.all.js 6708行

//设置默认字体和字号

//font-family不能呢随便改,在safari下fillchar会有解析问题

'body{margin:8px;font-family:sans-serif;font-size:14px;}' +

55.为防止xss攻击,对html内容进行了处理。

结果,把某个合法的内容给过滤了。

56.查看自己的积分排名。

转化下:有多少个人的分数大于等于自己的分数,就是自己的排名。

select name,nickname,image,total_score,(

select count(*) from user_score_grade where total_score>= (select total_score from user_score_grade where user_id = 16 and status=0 order by total_score desc limit 1)

and status=0) as rank

from user_score_grade usg

left join user u on u.id = usg.user_id

where user_id = 16 and status =0;

57.nodejs中"__dirname"是当前文件所在的目录。

exports.croosdomain = function(req, res, next) {

res.sendfile(__dirname+'/crossdomain.xml');

};

上传图片需要配置跨域文件。

58.部署方式:源程序A,复制一份为B,覆盖B程序,把B作为A,减少系统“停机”时间。

(这种,会不会出现不一致的情况,在A运行的时候,产生了新的内容)

59.百度Social_uid值很大,int11位不够存储,改为bigint40。

60.发一份邮件,打印以下,至少知道哪些发送成功了。

emailSender.sendEmail(l, subject, content);

System.out.println("mail:"+mail);

需要捕捉异常。

61.

var sql="select u.id,name,image,email,remark,nickname,industry,company,career,school,major,degree_id,sex,usg.grade_num from user u "+

" left join user_score_grade usg on (usg.user_id=u.id and usg.status=:status) "+

" where u.id =:userId ";

var sql="select u.id,name,image,email,remark,nickname,industry,company,career,school,major,degree_id,sex,usg.grade_num from user u "+

" left join user_score_grade usg on (usg.user_id=u.id ) "+

" where u.id =:userId and usg.status=:status";

“and usg.status=:status”放在 on后面和where后面,效果是不一样的。

如果在where后面,如果usg没有这个用户,会找不到结果

62.停用百度跟踪,注重个人隐私
http://www.baidu.com/duty/safe_control.html
63.!important声明的样式优先级最高,如果冲突再进行计算。font-size:20px !important;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  技术 工作问题 经验