Java 使用spring jpa获取数据
我仍然是java和spring的初学者,我已经在mysql中存储了名为Java 使用spring jpa获取数据,java,spring,hibernate,spring-boot,jpa,Java,Spring,Hibernate,Spring Boot,Jpa,我仍然是java和spring的初学者,我已经在mysql中存储了名为的表,我正在尝试逐行获取数据,其中状态==0,我的表如下所示: -------------+------------+------------+------------+--------------+--------+--------+--------+--------+--------------+ | Msisdn | Entry_Date | Start_Date | End_Date | Service_
的表,我正在尝试逐行获取数据,其中状态==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”的bean
资源
[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);
}
测试文件
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());
}
}
package com.example.accessingdatajpa;
导入静态org.assertj.core.api.Assertions.assertThat;
导入java.util.List;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
导入org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
导入org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@DataJpaTest
公开类要约人报告测试{
@自动连线
私人测试管理者实体管理者;
@自动连线
私人要约;
@试验
公共无效testFindByStatus(){
报价=新报价();
entityManager.persist(提供);
List findByStatus=offer.findByStatus(offer.getStatus());
assertThat(findByStatus).extracting(Offers::getStatus).containsOnly(Offer.getStatus());
}
}
提供没有主键。必须用@Id注释主键属性
像
你需要像这样做:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String Msisdn;
您缺少一个用@Id
注释的字段。每个@实体
都需要一个@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注释的位置标记了持久性状态访问
标识符唯一地标识该表中的每一行。通过
默认情况下,假定表的名称与名称相同
实体的名称。显式给出表的名称或指定
关于表的其他信息,我们将使用
表注释。逻辑名称可以是
由用户指定(例如使用@Column或@Table),也可以
由Hibernate通过隐式命名策略隐式确定
合同
官方的。我发现这里有不少错误:
1st
将@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);
}
@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("");
};
}
}
4th
如果要使用CommandLineRunner
,则需要实现它。您可以用一种非常简单的方法来实现,只需在引导类中实现即可
访问datajpaaapplication.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("");
}
}
您需要像@Id@GeneratedValue(strategy=GenerationType.AUTO)一样执行私有字符串Msisdn;每次运行代码时,它都会返回此警告:启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2019-10-16 16:13:01.855错误16835---[main]o.s.boot.SpringApplication:应用程序运行失败org.springframework.beans.factory.unsatifiedpendencyException:创建名为“demo”的bean时出错,该bean在com.example.accessingdatajpa.accessingdatajpaa应用程序中定义:通过方法“demo”参数0表示的未满足依赖关系;嵌套异常是在上下文初始化过程中遇到的org.springframework.beans.factorException-取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“AccessingDataJPAAApplication”的bean时出错:通过字段“repository”表示的未满足依赖关系;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“OfferRepository”的bean时出错:调用init方法失败;嵌套异常为java.lang.IllegalArgumentException:未能为方法public abstract java.util.List com.example.accessingdatajpa.OffersRepository.findByStatus(java.lang.String)创建查询!按照约定,无法在此ManagedType[com.example.accessingdatajpa.Offers]上找到具有给定名称[status]的属性,属性通常以小写开头。将Offers
类中的属性Status
重命名为Status
private String status
谢谢,它已经工作了,但问题是它没有在控制台well上打印结果,这是因为您没有在控制台上打印任何内容。如果要使用CommandLineRunner,则需要实现它。我已经更新了我的答案。你能帮我回答这个问题吗
@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("");
};
}
}
@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("");
}
}