遇到的一些问题及解决方法

22 篇文章 0 订阅
12 篇文章 0 订阅

问题一:Cannot resolve method 'query(java.sql.Connection, java.lang.String,无法解析方法的查询

解决方法:

1.清空缓存

左上角点击“File”---->“Invalidate Caches / Restart”

 试了一下,结果不如人意

 于是改用其他方法:

.添加tomcat

左上角点击“File”----->Project Structure

 新出现对话框点击“Modules”---->“+”---->“Library 或 Module Dependency..”

 已经在里面了,啧!难搞

备用方法

若解决不了,尝试返回方法1:“File”---->“Invalidate Caches / Restart”---->弹出对话框,点击“Invalidate and Restart”。

结果都于事无补,于是检查了上下,发现问题不在系统配置上,而是方法数据类型前后不匹配,之前想将符合注册条件的人数以int类型输出,但是后来想实现输出String类型的结果,前后没一致导致结果无法输出。

改成一致数据类型以后我的问题也解决了。

在小伙伴大头的提醒下,我意识到新的需求需要做出一些改变:

发布兼职人员基本功能中有描述出了可以对兼职信息进行发布外,还可以对自己发布的兼职信息进行查看(状态:未通过,已通过,未审批),以及查看审核过关的信息是否有兼职人员已经接取。可以对自己发布的兼职信息进行撤销

而如何查找呢?在job中只凭jid是可以查找,但是无法精确查找,所以新引入了uid,两个字段一起查找,实现精确查找。

首先是在是实体类上添加uid,然后是数据库job表也要添加uid字段并且建立外键,删除时遇到一些问题,首先是之前applyjob表建立过uid、jid外键,删除时会有外键关联,会弹出提示:

 注释外键关联,记得选禁用外键检查

 最后添加外键要重新运行确保建立联系成功。

 

 在输入时直接略过性别并且输出报错进入下一个输入,出现问题的原因是:Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,它判断读取结束的标示是  空白符;比如空格,回车,tab 等等

next就是读取到空格就结束了,nextLine是读取到回车结束

所以我还没有输入nextLine的字符串,它已经停掉了。

解决方法:

将scanner.nextLine改成scanner.next

成功啦!

查找发布兼职人员需要遍历用户list集合,遍历前先判断集合是否为空,

 其中

参考资料:

http://t.csdn.cn/BDeOp

终于测试辣!

第一次完成的大测,结果就报错:

Column count doesn't match value count at row 1 Query

列计数与第一行查询中的值计数不匹配

 检查发现是user表之前有11个字段,后来加入了字段

user.getRegdat(),user.getCount(),user.getStatus());
分别是//注册日期    //升级需要未逾期完成兼职次数    //用户状态 0代表待业中,1代表工作中,2表示已完成

但是数据表和UserDaoImpl未更新,更新以后再试

 

普通用户 注册成功!数据库也成功存入。

同理发布兼职者也注册成功

 管理员注册

添加兼职信息时报错:

 Cannot add or update a child row: a foreign key constraint fails ……

无法添加或更新子行:外键约束失败

问题原因:

经过查找,发现在job,user表里uid的属性定义都not null,但是兼职信息录入时未指定用户,用“ ”占位,结果查询为空,自然报错

解决方法:

将uid设置非空即可,

这里将其设置为user.getUid(),将操作者用户存进去即可 

问题:

之前输入的jid“001”无效,变成了“1”,并且查找不到

出现原因:

将jid设置为int类型,int类型001=1,自然查不到

解决方案:

将jid改为String类型

但是!!!事后小伙伴提醒后在数据库查询发现int字段能被String查询条件查找到,所以不用改

查询如图所示:

 

 Duplicate entry '1' for key 'job.PRIMARY' Query

百度翻译一下,意思是键“primary”的重复条目“1”,也就是主键重复(但是可以正常录入数据库,查询结果见上上图)

int类型001=1,限制了但没完全限制,无效限制

改一下,将“int jid = TSUtils.number0(3,15);”

改为“int jid = TSUtils.number0(1,15);”

java List集合中contains方法总是返回false


发现在contains方法会调用 o.equals(elementData[i])方法,其中elementData[i]是个object类的实例。也就是说我在调用list.contains(user)时实际上比较的是user.equals(object) 这当然会返回false。

 解决方法:

在Job类中改写equals方法,
注意:
 public boolean equals(Object obj) {
        //多态的弊端是无法使用子类特有的属性和行为,所以得向下转型
        Job p1 = (Job) obj;//将Object向下转型为job
        return ((Integer)this.jid).equals(p1.jid); //!!!!因为jid是int类型需要将其强转为lnerger类型才能重写方法
    }

 

还有很多细节,以结束工作为例:

还有结束日期的设置,String转Date进行compareTo比较

小于的就返回-1 按时完成,等于的就返回0 按时完成,大于的就返回1 逾期

工作状态、用户状态的改变

信用等级的评定

余额的计算

……

都要注意

 @Override    //结束兼职工作
    public boolean endJob(User user, int jid) throws SQLException, ParseException {
        User user1 = userDao.findUserByUid(user);
        ApplyJob applyJob = jobDao.findApplyJob(user, jid);  //查询已申请兼职
        Job job = jobDao.findJob(jid);
        if (applyJob != null) {
//            if (upte1 == 1 && applyJob.getJobStatus()==0 ) { } //受影响的行数1  工作状态status;//用户状态,0代表待业中或工作已完成,1代表工作中
            //判断是否逾期
            SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
            Date now = new Date(System.currentTimeMillis());   //获取当前结束时间
            Date jobtimes = ft.parse(job.getJobTime());        //获取给定的时间,String转Date
            System.out.println("当前结束时间为:" + ft.format(now));
            System.out.println("给定的时间为:" + jobtimes);
            long times = (now.getTime() - jobtimes.getTime()) / (1000 * 60 * 60 * 24);   //计算逾期时间(单位:天)

            //1.按时完成的情况
            if (now.compareTo(jobtimes) == -1 || now.compareTo(jobtimes) == 0) {
                //小于的就返回-1 按时完成,等于的就返回0 按时完成,大于的就返回1 逾期
                //余额的结算
                double balance = user1.getBalance();  //获取当前最新余额
                double newBalance = balance + job.getSalary();
                System.out.println("您本次工作能获得的薪水为" + job.getSalary() + ",您的账户余额为:" + newBalance);
                //余额写入数据库
                jobDao.midifyBalance(user, newBalance);
                //用户余额为0,自动结束工作,结算费用
                if (newBalance == 0) {
                    //用户状态改变 从已工作1→未工作0
                    //用户的工作状态修改  status;//用户状态,0代表待业中或工作已完成,1代表工作中
                    jobDao.modifyStatus(user, 0);
                    userDao.midifyJobStatus(user, jid);
                    System.out.println("用户余额为0,自动结束工作");
                }

                //信用的结算
                int creditRating = user1.getCreditRating(); //获取当前最新信用等级
                if (creditRating == 5) {
                    System.out.println("您的信用已是最高5级,请继续保持!");
                } else if (0 < creditRating && creditRating < 5) {
                    int count = user1.getCount() - 1;
                    if (count == 0) {
                        userDao.modifyCredit(user, creditRating + 1);  //信用等级修改
                    } else {
                        System.out.println("按时完成" + count + "次兼职工作后信用等级恢复至" + (user1.getCreditRating() + 1) + "级");
                    }
                }
                //用户状态改变 从已工作1→未工作0
                //用户的工作状态修改  status;//用户状态,0代表待业中或工作已完成,1代表工作中
                jobDao.modifyStatus(user, 0);
                userDao.midifyJobStatus(user, jid);
                userDao.modifyCredit(user, creditRating);  //信用等级修改
                return true;
            }

            //2.逾期完成的情况
            if (now.compareTo(jobtimes) == 1) {
                //小于的就返回-1 按时完成,等于的就返回0 按时完成,大于的就返回1 逾期
                //余额的结算
                double balance = user1.getBalance();  //获取当前最新余额
                double number = job.getSalary() - (times * job.getDeductSalary() * job.getSalary()); //本次可获得薪资
                double newBalance = balance + number;
                //当前余额 = 先前余额 + 本次工作工资 - (逾期时间 * 逾期扣除费用比率 * 工作工资)
                //用户余额为0,自动结束工作,结算费用
                if (newBalance <= 0) {
                    //用户状态改变 从已工作1→未工作0
                    //用户的工作状态修改  status;//用户状态,0代表待业中或工作已完成,1代表工作中
                    jobDao.modifyStatus(user, 0);
                    userDao.midifyJobStatus(user, jid);
                    newBalance = 0.0;
                    System.out.println("用户余额为0,自动结束工作");
                    System.out.println("您本次工作能获得的薪水为" + 0.0 + ",您的账户余额为:" + 0.0);
                    //薪资、余额写入数据库
                    jobDao.midifyBalance(user, newBalance);
                }
                System.out.println("您本次工作能获得的薪水为" + number + ",您的账户余额为:" + newBalance);
                //余额写入数据库
                jobDao.midifyBalance(user, newBalance);

                //信用的结算
                int creditRating = user1.getCreditRating(); //获取当前最新信用等级
                if (1 < creditRating && creditRating <= 5) {
                    userDao.modifyCredit(user, creditRating - 1);  //信用等级修改
                    System.out.println("您已逾期,信誉等级扣除一级,当前您的信誉等级为:" + (creditRating - 1) + "级");
                    System.out.println("再按时完成" + user1.getCount() + "次兼职工作后信用等级恢复至" + (user1.getCreditRating()) + "级");
                } else if (creditRating == 1) {
                    userDao.modifyCredit(user, 0);  //信用等级修改
                    System.out.println("您已逾期,信誉等级扣除一级,当前您的信誉等级为:0级");
                }

                //用户状态改变 从已工作1→未工作0
                //用户的工作状态修改  status;//用户状态,0代表待业中或工作已完成,1代表工作中
                jobDao.modifyStatus(user, 0);
                userDao.midifyJobStatus(user, jid);

                return true;
            }
            System.out.println("该工作已结束!");
        }
        return false;
    }

运行成功!

 最后终于成功实现了功能:

项目的完成除了自己的努力以外,还要感谢葫芦葫芦葫芦同学以及沐风游云同学的倾情帮助,谢谢她们的援手,给我们鼓掌,呱唧呱唧! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值