извлечение данных с помощью Spring jpa - PullRequest
0 голосов
/ 16 октября 2019

я все еще начинающий с Java и Spring, я уже сохранил таблицу в MySQL с именем Offers, я пытаюсь получить строку данных по строке where the Status == 0, моя таблица выглядит так:

-------------+------------+------------+------------+--------------+--------+--------+--------+--------+--------------+
| Msisdn      | Entry_Date | Start_Date | End_Date   | Service_Type | Status | Parm_1 | Parm_2 | Parm_3 | Process_Date |
+-------------+------------+------------+------------+--------------+--------+--------+--------+--------+--------------+
| 7777777777  | 2019-01-11 | 2019-02-15 | 2019-03-03 | 1            |      1 | 1      | 1      | 1      | 2019-10-15   |
| 7888888899  | 2019-01-11 | 2019-02-12 | 2019-03-03 | 1            |      0 | 1      | 1      | 1      | 2019-10-15   |
| 799999999   | 2019-01-11 | 2019-02-10 | 2019-03-03 | 1            |      0 | 1      | 1      | 1      | 2019-10-15   |
| 79111111111 | 2019-01-28 | 2019-02-27 | 2019-03-03 | 1            |      0 | 1      | 1      | 1      | 2019-10-15   |
+-------------+------------+------------+------------+--------------+--------+--------+--------+--------

когда я пытаюсь запустить свой код, его возвращаемое значение

org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'entityManagerFactory', определенным в ресурсе пути к классу [org / springframework / boot / autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: сбой вызова метода init;вложенное исключение: org.hibernate.AnnotationException: для сущности не указан идентификатор: com.example.accessingdatajpa.Offers

Предложения

package com.example.accessingdatajpa;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;


@Entity
public class Offers {

    @GeneratedValue(strategy=GenerationType.AUTO)
    private String Msisdn;
    private String Entry_Date;
    private String Start_Date;
    private String End_Date;
    private String Service_Type;
    private String Status;
    private String Parm_1;
    private String Parm_2;
    private String Parm_3;
    private String Process_Date;

    protected Offers() {}

    public Offers(String Msisdn, String Entry_Date, String Start_Date, String End_Date, String Service_Type, String Status, String Parm_1 ,String Parm_2, String Parm_3, String Process_Date) {
        this.Msisdn = Msisdn;
        this.Entry_Date = Entry_Date;
        this.Start_Date = Start_Date;
        this.End_Date = End_Date;
        this.Service_Type = Service_Type;
        this.Status = Status;
        this.Parm_1 = Parm_1;
        this.Parm_2 = Parm_2;
        this.Parm_3 = Parm_3;
        this.Process_Date = Process_Date;
    }

    @Override
    public String toString() {
        return String.format(
                "Offers[Msisdn='%s', Entry_Date='%s', Start_Date='%s', End_Date='%s', Service_Type='%s', Status='%s', Parm_1='%s', Parm_2='%s', Parm_3='%s',Process_Date='%s']",
                Msisdn, Entry_Date, Start_Date, End_Date, Service_Type, Status, Parm_1,Parm_2,Parm_3,Process_Date);
    }

    public String getMsisdn() {
        return Msisdn;
    }

    public String getProcess_Date() {
        return Process_Date;
    }

    public String getEntry_Date() {
        return Entry_Date;
    }

    public String getStart_Date() {
        return Start_Date;
    }

    public String getEnd_Date() {
        return End_Date;
    }

    public String getService_Type() {
        return Service_Type;
    }

    public String getStatus() {
        return Status;
    }

    public String getParm_1() {
        return Parm_1;
    }

    public String getParm_2() {
        return Parm_2;
    }

    public String getParm_3() {
        return Parm_3;
    }
}

Архив предложений

package com.example.accessingdatajpa;

import java.util.List;

import org.springframework.data.repository.CrudRepository;

public interface OffersRepository extends CrudRepository<Offers, String> {

    List<Offers> findByStatus(String Status);

    Offers findByMsisdn(String Msisdn);
}

AccessingDataJpaApplication

package com.example.accessingdatajpa;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class AccessingDataJpaApplication {

    private static final Logger log = LoggerFactory.getLogger(AccessingDataJpaApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(AccessingDataJpaApplication.class);
    }

    @Bean
    public CommandLineRunner demo(OffersRepository repository) {
        return (args) -> {

            // fetch by status =0
            log.info("Offers found with findByStatus('0'):");
            log.info("--------------------------------------------");
            repository.findByStatus("0").forEach(on -> {
                log.info(on.toString());
            });
            log.info("");
        };
    }

}

тестовый файл

package com.example.accessingdatajpa;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@DataJpaTest
public class OffersRepositoryTests {
    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private OffersRepository offer;

    @Test
    public void testFindByStatus() {
        Offers Offer = new Offers();
        entityManager.persist(Offer);

        List<Offers> findByStatus = offer.findByStatus(Offer.getStatus());

        assertThat(findByStatus).extracting(Offers::getStatus).containsOnly(Offer.getStatus());
    }
}

Ответы [ 4 ]

1 голос
/ 16 октября 2019

Я вижу там довольно мало ошибок:

1-й

Добавить @Id аннотацию к msisdn

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String Msisdn;

2-й

Добавить @Repository аннотацию к OffersRepository

@Repository
public interface OffersRepository extends CrudRepository<Offers, String> {

    List<Offers> findByStatus(String Status);

    Offers findByMsisdn(String Msisdn);
}

3-й

Добавить компонент с автопроводкой типа OffersRepositoryв ваш класс AccessingDataJpaApplication и удалите параметр OffersRepository repository из вашего метода public CommandLineRunner demo(OffersRepository repository)

@SpringBootApplication
public class AccessingDataJpaApplication {

    private static final Logger log = LoggerFactory.getLogger(AccessingDataJpaApplication.class);

    @Autowired
    private OffersRepository repository;

    public static void main(String[] args) {
        SpringApplication.run(AccessingDataJpaApplication.class);
    }

    @Bean
    public CommandLineRunner demo() {
        return (args) -> {

            // fetch by status =0
            log.info("Offers found with findByStatus('0'):");
            log.info("--------------------------------------------");
            repository.findByStatus("0").forEach(on -> {
                log.info(on.toString());
            });
            log.info("");
        };
    }

}

4-й

Если вы хотите использовать CommandLineRunner,вам нужно реализовать это. Вы можете сделать это очень просто, просто внедрив в своем классе начальной загрузки.

AccessingDataJpaApplication.java

@SpringBootApplication
public class AccessingDataJpaApplication implements CommandLineRunner {

    @Autowired
    private OffersRepository repository;

    private static final Logger log = LoggerFactory.getLogger(AccessingDataJpaApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(AccessingDataJpaApplication.class);
    }

    @Override
    public void run(String...args) {
        log.info("Offers found with findByStatus('0'):");
        log.info("--------------------------------------------");
        repository.findByStatus("0").forEach(on - >{
            log.info(on.toString());
        });
        log.info("");
    }

}
0 голосов
/ 16 октября 2019

Вам нужно сделать, как:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String Msisdn;
0 голосов
/ 16 октября 2019

Вам не хватает поля, отмеченного @Id. Каждому @Entity требуется @Id - это присваивается первичному ключу в базе данных. В вашем классе сущности укажите аннотации, такие как:

@Entity
@Table(name = "OFFERS")
public class Offers {

   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name = "Msisdn")
   private String Msisdn;

   @Column(name = "Entry_Date")   
   private String Entry_Date;

   @Column(name = "Start_Date")
   private String Start_Date;

   @Column(name = "End_Date")
   private String End_Date;

   @Column(name = "Service_Type")
   private String Service_Type;

   @Column(name = "Status")
   private String Status;

   @Column(name = "Parm_1")
   private String Parm_1;

   @Column(name = "Parm_2")
   private String Parm_2;

   @Column(name = "Parm_3")
   private String Parm_3;

   @Column(name = "Process_Date")
   private String Process_Date;
   //Setters and getters
}

Это нормально, не указывайте таблицу и столбец с помощью аннотации, если ваш столбец и имя таблицы придерживаются стратегии неявного именования.

Размещение аннотации @Id обозначает стратегию доступа к постоянному состоянию. Идентификатор уникально идентифицирует каждую строку в этой таблице. По умолчанию предполагается, что имя таблицы совпадает с именем объекта. Чтобы явно указать имя таблицы или указать другую информацию о таблице, мы бы использовали аннотацию javax.persistence.Table. Логическое имя может быть явно указано пользователем (например, с помощью @Column или @Table) или ономожет быть неявно определено Hibernate через контракт ImplicitNamingStrategy.

Официальный Документ .

0 голосов
/ 16 октября 2019

Предложения не имеют первичного ключа. Вы должны аннотировать атрибут первичного ключа с помощью @ Id

Like

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