我想通过电子邮件,年份和学期(学期)从数据库中检索数据。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想通过电子邮件,年份和学期(学期)从数据库中检索数据。相关的知识,希望对你有一定的参考价值。
我想通过电子邮件来检索当前用户的考勤情况,具体如下 出席情况 表。接下来,我必须要精确地检索哪一年和哪一学期的出勤率,所以我试着在控制器中输入 "Date "作为参数,在服务中,但它没有帮助。它给了我下一个参数
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'attendanceRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List com.example.demo.Repositories.AttendanceRepository.findAttendanceByEmail(java.lang.String,java.lang.String)! At least 2 parameter(s) provided but only 1 parameter(s) present in query.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1290) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1210) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
... 32 common frames omitted
我也试过不使用参数,这是我的代码。
AttendanceController.java
@Autowired
AttendanceService attendanceService;
// Get User Attendance
@RequestMapping(value = "/attendance", method = RequestMethod.GET)
public List<Attendance> getUserAttendance(@AuthenticationPrincipal MyUserDetails myUserDetails, java.util.Date date) {
return attendanceService.getUserAttendanceByEmail(myUserDetails.getEmail(), date);
}
考勤记录库.java
public interface AttendanceRepository extends JpaRepository<Attendance, Integer> {
List<Attendance> findAttendanceByEmail(String email, String year_and_term);
}
考勤服务.java
@Autowired
AttendanceRepository attendanceRepository;
// Finds in attendance table by email of the current user
public List<Attendance> getUserAttendanceByEmail(String email, Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int term = cal.get(Calendar.MONTH);
if (term >= 1 && term <= 5)
term = 1;
else if (term >= 9 && term <= 12)
term = 2;
String year_and_term = year + "-" + (year+1) + " (" + term + ")";
System.out.println(year_and_term);
return attendanceRepository.findAttendanceByEmail(email, year_and_term);
}
AttendanceEntity.java
@Entity
@Table(name = "attendance")
public class Attendance {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToOne
@JoinColumn(name="subject_id", nullable=false)
private Subjects subjects;
private String email;
private Integer absent;
private Integer attend;
private Integer permitted;
private String year_and_term;
public Attendance(Integer id, Subjects subjects, String email, Integer absent, Integer attend, Integer permitted, String year_and_term) {
this.id = id;
this.subjects = subjects;
this.email = email;
this.absent = absent;
this.attend = attend;
this.permitted = permitted;
this.year_and_term = year_and_term;
}
public Attendance() {
}
// getters and setters..
这是我的桌子 出席情况 在数据库中。
+----+------------+--------+--------+--------+-----------+---------------+
| id | subject_id | email | absent | attend | permitted | year_and_term |
+----+------------+--------+--------+--------+-----------+---------------+
| 1 | 1 | damir | 1 | 1 | 1 | 2019-2020 (2) |
| 2 | 2 | damir | 0 | 5 | 2 | 2019-2020 (2) |
| 3 | 3 | rapkat | 0 | 10 | 0 | 2019-2020 (2) |
| 4 | 1 | damir | 10 | 20 | 5 | 2019-2020 (1) |
| 5 | 2 | damir | 2 | 20 | 0 | 2019-2020 (1) |
+----+------------+--------+--------+--------+-----------+---------------+
其实你有两个问题,第一个问题是你在变量名year_and_term中加入了spring jpa关键字,即 "and",你把这两个不同的值互相关联,可能将来你需要分别查询year和sem,那你就麻烦了。
所以现在你有两个解决方案:-
如果你仍然想使用clubbed,那么请重构变量名,如yearNterm,即用N或其他你想要的东西代替and。
List findByEmailAndYearNterm(String email, String year_and_term);
或者你可以用我的方法,即把2个变量分开,比如1是年份,2是期限,那么你的查询就会像:-。
List findByEmailAndYearAndTerm(String email, String year, String term)。
你想获得基于两个字段的数据,但只传递一个字段。因此,为了使它工作,请做以下修改。
始终使用骆驼大小写变量名(标准做法)year_and_term - yearAndTerm。
用其他东西重命名字段,因为它可能会在jpa查询中产生一些问题(and是一个关键字)。
将方法调用改为
findAttendanceByEmailAndYearAndTerm。
以上是关于我想通过电子邮件,年份和学期(学期)从数据库中检索数据。的主要内容,如果未能解决你的问题,请参考以下文章
2019-2020-1学期 20192406 《网络空间安全专业导论》第三周学习总结
2019-2020-1 学期 2427 《网络空间安全导论》 第三周学习总结
2019-2020-1学期2092412《网络空间安全专业导论》第三周学习总结