java - 使用 spring jpa 获取数据
问题描述
我还是 java 和 spring 的初学者,我已经在 mysql 中存储了名为 as 的表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:在类路径资源[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]中定义名称为“entityManagerFactory”的bean创建错误:调用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);
}
访问DataJpaApplication
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());
}
}
解决方案
我在那里看到很少的错误:
第一
添加@Id
注释到msisdn
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String Msisdn;
第二
添加@Repository
注释到OffersRepository
@Repository
public interface OffersRepository extends CrudRepository<Offers, String> {
List<Offers> findByStatus(String Status);
Offers findByMsisdn(String Msisdn);
}
第三
将类型的自动装配 bean 添加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
,你需要实现它。你可以用一种非常简单的方式来做,只需在你的引导类中实现。
访问DataJpaApplication.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("");
}
}
推荐阅读
- javascript - .filter 不是函数错误?
- android - 有没有人让模拟器与网络摄像头一起工作?
- node.js - 无法在 MongoDB 中找到正确的查询
- windows - 在 Windows 中将 .gdbinit 放在哪里?
- hyperledger-fabric - 如何在不同的频道上安装链码
- css - CSS从左侧裁剪img
- javafx - JavaFX:ping IP 地址时,UI 卡住了几秒钟
- javascript - 遍历数组并连续播放音频
- java - org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“instance”的bean
- android - AOSP 构建停止:子命令失败