я хочу получить данные из БД по электронной почте, году и семестру (семестр) - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу получить информацию о посещаемости текущего пользователя по его электронной почте в таблице Посещаемость . Далее мне нужно точно указать год и посещаемость семестра, которые я хочу получить, поэтому я попытался сделать это, введя «Дата» в качестве параметра в контроллере, в сервисе, но это не помогает. Это дало мне следующий

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);
    }

AttendanceRepository. java

public interface AttendanceRepository extends JpaRepository<Attendance, Integer> {
    List<Attendance> findAttendanceByEmail(String email, String year_and_term);
}

AttendanceService. 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) |
+----+------------+--------+--------+--------+-----------+---------------+

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Вы хотите получить данные, основанные на двух полях, но передавая только одно. Поэтому, чтобы заставить его работать, внесите следующие изменения.

  1. Всегда используйте имена переменных в случае верблюда (стандартная практика) year_and_term - yearAndTerm

  2. Переименуйте поле чем-либо иначе, поскольку это может создать некоторые проблемы с запросами jpa (AND - это ключевое слово)

  3. Измените вызов метода на

    findAllAttendanceByEmailAndYearAndTerm

1 голос
/ 22 апреля 2020

На самом деле у вас есть 2 проблемы, во-первых, вы создали имя переменной с ключевым словом jpa, т. Е. 'И' в имени переменной year_and_term, и вы скомбинировали оба значения друг с другом, возможно, в будущем вам потребуется запросите оба года и сем по отдельности, тогда у вас будут проблемы.

Итак, теперь у вас есть 2 решения: -

  1. , если вы все еще хотите go с дубинкой Затем, пожалуйста, измените имя переменной на год_Терм, то есть просто замените и на N или что-то другое. тогда ваш запрос будет выглядеть так: -

    Список findByEmailAndYearNterm (String email, String year_and_term);

  2. Или вы можете go с помощью моего подхода, т.е. отделить 2 его 2 переменным, например, 1 - год, а 2 - срок, тогда ваш запрос будет выглядеть следующим образом: -

    Список findByEmailAndYearAndTerm (String email, String year, String term);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...