spring-data-jpa为您实现存储库

时间:2016-08-23 13:18:27

标签: spring spring-boot spring-data spring-data-jpa

spring-data-jpa实现存储库

我刚开始使用 Spring-boot Accessing-data-jpa ,我决定查看https://spring.io提供的指南之一。我决定看的指南是accessing-data-jpa。我跟着它走到最后,然后运行我的应用程序。据我所知,我收到了一个错误消息。

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property name found for type User!
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:77)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:272)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:243)
at org.springframework.data.repository.query.parser.Part.<init>(Part.java:76)

问题是什么似乎很容易。在某处,它正在寻找房产&#34;名称&#34;在我的用户类中。但我实际上并没有使用房产&#34;名称&#34;任何地方。

我的存储库界面:

public interface UserRepository extends JpaRepository<User, Long> {
   List<User> findByName(String userName);
}

我的用户类:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long userID;
    private LocalDateTime joinDate;
    private String userName;
    private String email;

    protected User(){}

    public User(String userName){
        this.userName = userName;
    }

    @Override
    public String toString() {
        return String.format("User[id=%d, userName=%s, email= %s]",userID, userName,email);
    }
}

应用程序类:

@SpringBootApplication
public class Application {

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

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

    @Bean
    public CommandLineRunner demo(UserRepository repository){
        return (args) -> {
            //Save a few Users
            repository.save(new User("Niek"));
            repository.save(new User("Costas"));
            repository.save(new User("Eric"));
            repository.save(new User("Philip"));
            repository.save(new User("Barry"));

            //Fetch all Users
            log.info("Users Found With findAll()");
            log.info("--------------------------");
            for(User user: repository.findAll()){
                log.info(user.toString());
            }
            log.info("");

            //Fetch one User
            log.info("User found With findOne(1L)");
            log.info("--------------------------");
            log.info(repository.findOne(1L).toString());

            //Fetch one User By Name
            log.info("User found with findByName(\"Niek\")");
            log.info("--------------------------");
            for(User user: repository.findByName("Niek")){
                log.info(user.toString());
            }
        };
    }
}

我假设有些人在想你没有实现你的存储库。

  

在典型的Java应用程序中,您希望编写一个实现CustomerRepository的类。但这就是使Spring Data JPA如此强大的原因:您不必编写存储库接口的实现。 Spring Data JPA在您运行应用程序时动态创建实现。

这让我想到了我的问题:

  • 是不是因为Spring Data JPA提供的存储库实现,它要求提供属性&#34; name&#34;而不只是使用属性&#34; userName&#34;我提供了什么?
  • 如果上一个问题的回答是&#34;是&#34;,可以安全地假设提供自己的实现将更不容易出错吗?因为似乎生成的实现似乎适用于某种约定。

2 个答案:

答案 0 :(得分:2)

在写出这个问题时,我想出了答案

答案很简单:

  • 是的,因为 Spring Data JPA 创建了实现,它无法识别属性&#34; userName&#34;并要求财产&#34; name&#34;。原因很简单,因为在接口中我声明了方法为。public List<User> findByName(String userName),显然有一个命名约定,其中属性需要适合方法名称。所以我的方法必须是public List<User> findByUserName(String userName)
  • 因此,自己实现界面并不是特别优先,但是你需要密切关注像我这样的小公约。

答案 1 :(得分:0)

您忘记在Shell32.ShellClass objShel = new Shell32.ShellClass(); objShel.ToggleDesktop(); POJO课程中注释所有字段。为此,您必须使用User注释注释所有字段(第一个除外)(在这种情况下,必须使用@Id进行注释)。此外,您必须确保所有指定字段都包含所有getter / setter。