当前位置: 首页 > 面试题库 >

如何使用Spring数据获取数据

尉迟景福
2023-03-14
问题内容

嘿,我想创建一个扩展JpaRepository的存储库并获取结果而无需编写实际查询,在我的示例中,我有2个表Book和Author,它们之间存在多对多关系,假设我想按特定的author_id来获取图书清单,因为在我图书实体,我没有任何名为author_id的字段,因此我将如何使用JPARepository来获取结果而无需编写实际查询。我正在做这样的事情:我创建了一个BookDTO,其中包含Book和Author的对象,并且我创建了bookDTORepository来扩展JpaRepository并正在调用List<Book> findByAuthor_Id(Integer id);,但是它的抛出错误为:Not an managed type: class golive.data.bookdto我的书类是

package golive.data;



import java.util.ArrayList;

import java.util.HashSet;

import java.util.List;

import java.util.Set;



import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.JoinTable;

import javax.persistence.ManyToMany;

import javax.persistence.ManyToOne;

import javax.persistence.Table;

import javax.persistence.Transient;



import com.fasterxml.jackson.annotation.JsonIgnore;

import com.sun.istack.internal.NotNull;



@Entity

@Table(name="book")

public class Book implements java.io.Serializable{



    @Id

    @GeneratedValue

    private Integer id;



    @NotNull

    @Column(name="name")

    private String name;





    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY)

    @JoinTable(name = "writes", joinColumns = { @JoinColumn(name = "book_id") }, inverseJoinColumns = { @JoinColumn(name = "author_id") })

    private Set<Author> authors = new HashSet<Author>();





    public Set<Author> getAuthors() {

        return authors;

    }



    public Integer getId() {

        return id;

    }



    public String getName() {

        return name;

    }



    public void setAuthors(Set<Author> authors) {

        this.authors = authors;

    }



    public void setId(Integer id) {

        this.id = id;

    }



    public void setName(String name) {

        this.name = name;

    }





}

我的作家班是

package golive.data;



import java.util.ArrayList;

import java.util.HashSet;

import java.util.List;

import java.util.Set;



import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.JoinTable;

import javax.persistence.ManyToMany;

import javax.persistence.OneToMany;

import javax.persistence.OneToOne;

import javax.persistence.Table;

import javax.persistence.UniqueConstraint;



import com.fasterxml.jackson.annotation.JsonIgnore;

import com.sun.istack.internal.NotNull;



@Entity

@Table(name="author")

public class Author implements java.io.Serializable{



    @Id

    @GeneratedValue

    @Column(name="id")

    private Integer Id;



    @NotNull

    @Column(name="name")

    private String name;





    public Integer getId() {

        return Id;

    }



    public String getName() {

        return name;

    }







    public void setId(Integer id) {

        Id = id;

    }



    public void setName(String name) {

        this.name = name;

    }



}

我预定的课程是

package golive.data;



public class bookdto {



    private Book book;

    private Author author;

    public Book getBook() {

        return book;

    }

    public void setBook(Book book) {

        this.book = book;

    }

    public Author getAuthor() {

        return author;

    }

    public void setAuthor(Author author) {

        this.author = author;

    }



}

我的bookDTORepository是:

package golive.data;



import java.util.List;



import org.springframework.data.jpa.repository.JpaRepository;



public interface bookDTORepository extends JpaRepository<bookdto, Book> {



    List<Book> findByAuthor_Id(Integer id);



}

我添加了书控制器方法:

    @RequestMapping(value = "/listbyauthor", method = RequestMethod.POST, produces = "application/json")

    public ResponseEntity<List<Book>> getBookByAuthorId(@RequestBody Author author,HttpServletResponse response) {

        try {

            Author temp = new Author();

            temp.setId(author.getId());

            temp.setName(author.getName());

            return new ResponseEntity<>(bookRepository.findByAuthor(temp), HttpStatus.OK);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return new ResponseEntity<>(HttpStatus.NO_CONTENT);

    }

问题答案:

您要查找特定作者的所有书籍,因此,在给定作者的情况下,检索其作者集中包含指定作者的所有书籍。

相关的JPQL运算符为:

http://www.objectdb.com/java/jpa/query/jpql/collection#NOT_MEMBER_OF_

[NOT] MEMBER [OF] [NOT] MEMBER OF运算符检查指定的持久性收集字段中是否包含指定的元素。

例如:

如果语言包含“英语”,则c.languages的“英语”成员为TRUE,否则为FALSE。如果语言不包含“英语”,则“英语”不属于c.languages。

您可能知道(也可能不知道),您正在使用Spring Data,它可以根据方法名称为您派生一些查询。但是,文档未提及对[NOT] MEMBER
[OF]运算符的支持:

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-
methods.query-creation

因此,您需要向存储库中添加一个自定义查询方法,该方法将类似于:

public interface BookRepository extends JpaRepository<Book, Integer> {

    @Query("select b from Book b where ?1 MEMBER OF b.authors")
    List<Book> findByAuthor(Author author);
}

作为参数传递的Author是从数据库 (通过您的AuthorRepository) 检索的持久实例



 类似资料:
  • 我有一个使用Spring3.1的web应用程序。1.我们有一个使用JdbcTemplate的genericDao。数据源在GenericDaoImpl中是这样注入的。 这是一把简单的刀。 目前,凭借独特的数据源,它工作得非常完美。applicationContext配置了注释。 现在我必须集成一个新的DAO,仍然使用通用道,但在另一个数据库上工作(所以是另一个数据源)。 我在服务中使用@Trans

  • 我正在测试一个基于酒店搜索的场景。所以我做了3个模型类,分别是酒店、房间和可用性 下面是我们正在使用的三个模型类。 Hotel.java @文档(集合="酒店")公共类酒店{ } Room.java @文件(收集=“房间”)公共教室{ } 可利用性Java语言 @文件(收集=“房间”)公共类可用性{ } 这些存储在两个mongodb集合中,一个用于酒店,另一个用于房间和可用性。 下面是我们从中提取

  • 问题内容: 如何从中加载数据并返回Map接口。如何在内部维护查询数据。我尝试加载,但出现以下异常,即 org.springframework.dao.IncorrectResultSizeDataAccessException:错误的结果 码:- 请帮我 问题答案: 如果您想获得一行,则比较合适。您选择的是无子句,因此您可能想要。该错误可能表明需要一行,但您查询的却是很多行。 查看文档。 有一个只

  • 我使用Spring引导,Spring数据JPA,我正在寻找解决方案,以获得给定表的所有列名。但没能按我的要求找到 不需要本机查询的解决方案。正在寻找使用spring数据抽象的通用解决方案。 我可以使用普通java获取列名,但我想使用spring数据JPA获取它们。

  • 我正在创建一个fetchBill函数。分配https://randomapi.com/api/006b08a801d82d0c9824dcfdfdfa3b3c到一个api变量。它使用浏览器的fetch函数向api发出HTTP请求。它在一个函数中使用箭头函数。然后调用fetch函数,并在将其转换为JSON后返回响应。使用另一个。然后调用第一个函数,该函数将JSON数据传递给displayCartTo

  • 我希望在JMETER中实现以下功能 JMeter加载带有id号的CSV文件 Jmeter中的每个用户/线程选择一个id号,并将其添加到他们的HTTP请求中,例如HTTP:www.testsite.com/test.php?id=x 重复步骤2,选择文件中的下一个id号。 这样,我就可以测试我的servlet是否使用连接池执行多个线程。 谢谢

  • 问题内容: 因此,我有一个返回jSON对象的链接,我需要对其进行解码并将其放入PHP中的变量中。 网址 这是它返回的对象 我真的只对 最后是消息 那么,如何提取jSON对象并将其放入PHP中可以稍后使用的正确变量中? 变量,如:,,,,,等。 我只需要知道如何检索jSON对象,然后将数据提取到PHP中的变量中即可。 我现在可以获取PHP数组,但是在调用正确的值时遇到了一些麻烦。这是数组。 自从我们

  • 问题内容: 我正在尝试创建一个用于在PHP上执行oracle sql语句的类。 这是我的index.php,我正在尝试调用我的函数 和我的dbcontrol.php用于我的功能 我不确定似乎有什么问题。但是每次我运行这个。页面上未显示任何内容。没有结果,没有数据。但是我确信数据库中有数据。 问题答案: 您总是得到空白页的原因是: oci_num_rows()函数不会返回您可能认为的所选行数。它返回