当前位置: 首页 > 知识库问答 >
问题:

Spring-Boot查询SELECT*from book(MANY to MANY rel with user)无法正常工作

弓举
2023-03-14

我试图从我的数据库中返回所有的书籍,但是一旦我将值插入到名为COLLECTION的连接表中(用于解决BOOK和USER之间的多对多Rel),我收到的输出看起来像一个循环(用Postman测试)。

图书实体的实施:

@Getter
@Setter
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor

@Entity
public class Book {

    @Id
    private Integer id;
    private String title;
    private String author;
    private String description;

    @OneToMany(mappedBy = "book", cascade = CascadeType.ALL)
    private Set<Collection> collections;

    public Book(String title, String author, String description) {
        this.title = title;
        this.author = author;
        this.description = description; 
}

    public Book(String title, String author Collection... collections){
        this.title = title;
        this.author = author;

        for (Collection collection : collections){
            collection.setBook(this);
        }
        this.collections = Stream.of(collections).collect(Collectors.toSet());
    }
}

用户实体的实现:

@Getter
@Setter
@NoArgsConstructor

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String email;
    private String password;
    private String username;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private Set<Collection> collections = new HashSet<>();

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
}

集合实体:

@Getter
@Setter
@NoArgsConstructor

@Entity
public class Collection implements Serializable {
    @Id
    @ManyToOne
    @JoinColumn
    private Book book;

    @Id
    @ManyToOne
    @JoinColumn
    private User user;

 public Collection(User user){
        this.user = user;
}
 @Override
    public boolean equals(Object o){
        if(this == o) return true;
        if(!(o instanceof Collection)) return false;
        Collection that = (Collection) o;
        return  Objects.equals(book.getTitle(), that.book.getTitle()) &&
                Objects.equals(book.getAuthor(), that.book.getAuthor()) &&
                Objects.equals(user.getUsername(), that.user.getUsername());
}
 @Override
    public int hashCode(){
        return Objects.hash(book.getTitle(), book.getAuthor(), user.getUsername());
    }
}

最后是BookRepository:

@Transactional
@Repository
public interface BookRepository extends JpaRepository<Book, Integer> {
// this causes sql syntax error
//    @Query(value = "SELECT b.id, b.title, b.author FROM book b", nativeQuery =  true)
//    List<Book> getAllBooks();

// this returns the loopy output from postman detailed below 
     List<Book> findAll();
}

我在Postman中收到的输出看起来像一个循环:

[{"id":1,"title":"Pride and Prejudice","author":"Jane Austen","users":[{"id":1,"email":"a@a.com","password":"$2a$10$BVXUCumzWyec9zEUeCv1r.m2pFwvAe7Cp1dLjiGfXuEEIHkhn3jHO","username":"user","books":[{"id":1,"title":"Pride and Prejudice","author":"Jane Austen", "users":[{"id":1,"email":"a@a.com","password":"$2a$10$BVXUCumzWyec9zEUeCv1r.m2pFwvAe7Cp1dLjiGfXuEEIHkhn3jHO, "username":"user","books": .......

预期的输出应该是我在数据库中的所有书籍的列表。

共有1个答案

卫弘义
2023-03-14

要设置book和user之间的关系,请使用@ManyToMany映射设置直接关系。作为参考,您可以选择以下链接-

https://www.callicoder.com/hibernate-spring-boot-jpa-many-to-many-mapping-example/

此外,您不需要显式定义findAll(),Jpa存储库本身提供了这些通用方法。

 类似资料:
  • 太长别读:@Depth(value=-1)抛出空指针,忽略1以上的其他值 在我的Spring Boot with Neo4j项目中,我有3个简单的实体与关系: 我创建了一个简单的图,如下所示: 使用以下存储库: 以及以下代码: 要检索与上图所示相同的图表(取自实际的neo4j仪表板),我执行,其中包含,然后打印保存的度量和检索的度量: 无论深度的值如何,我都无法获取包含所有子节点的Metric节点

  • 有的安全措施起作用,有的不起作用。 如果我的html文件中包含以下内容: 结果是: (->但它不起作用,因为每个人都可以一直看到它) (->按预期工作) (->有效) (->正确) 正如你所看到的,其他人根本没有出现。 html标记如下所示: 我的pom.xml具有以下依赖关系: 我的SecurityConfig如下所示: 所以基本上只要和角色没有任何关系,一切都是正常的。如果它是基于角色的,那么

  • 问题内容: 我有一个课程,如何让@JsonIgnore工作。即使将注释放在此处,它也不会影响输出。我正在使用杰克逊。 这是我的Controller方法: 这是我的servlet-context.xml: 问题答案: 我终于找到了解决方案。我将导入声明从 至 基本上,您必须确保在所有地方都使用相同的类。

  • } 这是我的配置。但似乎/用户/无法被任何人访问。 每当我输入“. hasRole(“RoleName”)”时,它只会拒绝该角色的访问。我得到一个{“时间戳”:1526671066818,“状态”: 403,“错误”:“禁止”,“消息”:“拒绝访问”,“路径”:“/用户”} 从那。 我想要的是,一些请求只允许“USER”访问,例如:“/entrysheet”,“/datasheet”等,而“ADM

  • 问题内容: 我正在尝试使用带注释的TX Spring支持。 应用程序上下文XML: 实际代码: 调用代码: 它给出了 FALSE。 我究竟做错了什么? 问题答案: 您应该在配置中添加它 在您的RepositoryClass上添加一个接口 这在你的测试课中 请参阅本教程。

  • 问题内容: 我有一个如下的JSON结构: 每个用户都有一个带有childByAutoId()键的元素“组”。然后,我有该应用程序中存在的所有组的列表。 每次运行该应用程序时,我都会获取当前用户登录的URL参考,并获取该用户的组列表(在这种情况下,登录的用户是具有3个组的“ rsenov”)。对于该用户所属的每个组,我都会遍历组url参考,以查找该3个组的信息。 我这样做是这样的: 我认为以这种方式