Java 如何使用Hibernate仅从两个单独的表返回两个字段?

Java 如何使用Hibernate仅从两个单独的表返回两个字段?,java,hibernate,Java,Hibernate,如何使用下面的类返回以下JSON,而不返回userId和bookId?我尝试过各种不同的查询,但都没有得到预期的结果。它不必完全匹配json名称。我只想要一个用户名和一个要归还的书籍列表 请参阅存储库@Query { "userName": "jamesbond007", "books": [ "Cat In the Hat", "Green Eggs and Ham

如何使用下面的类返回以下JSON,而不返回
userId
bookId
?我尝试过各种不同的查询,但都没有得到预期的结果。它不必完全匹配json名称。我只想要一个用户名和一个要归还的书籍列表

请参阅存储库
@Query

{
   "userName": "jamesbond007",
   "books": [
       "Cat In the Hat",
       "Green Eggs and Ham
   ]
}
Users.java:

@Getter
@Entity
@Table(name = "users")
public class User {
    @Id
    @OneToMany
    @JoinColumn(name = "user_id")
    private Integer userId;
    
   @Column(name = "user_name")
    private String userName;
}
@Getter
@Entity
@Table(name = "books")
public class Books {
    @Id
    @OneToMany
    @JoinColumn(name = "book_id") 
    private Integer bookId;

    @Column(name = "book_name")
    private String bookName;
}
@Getter
@Entity
@Table(name = "user_books")
public class UserBooks{
    @Id
    @Column(name = "user_book_id")
    private Integer userBookId;
    
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user
    
    @ManyToOne
    @JoinColumn(name = "book_id")
    private Book book;
}
public interface MyRepository extends JPARepository<UserBooks, Integer> {
     @Query("SELECT ub.userName, ub.bookName FROM UserBooks ub JOIN ub.User JOIN ub.Book WHERE userId=?1") //WHAT DO I DO HERE?
     UserBooks getAllBooksByUser(Integer userId);
}
Books.java:

@Getter
@Entity
@Table(name = "users")
public class User {
    @Id
    @OneToMany
    @JoinColumn(name = "user_id")
    private Integer userId;
    
   @Column(name = "user_name")
    private String userName;
}
@Getter
@Entity
@Table(name = "books")
public class Books {
    @Id
    @OneToMany
    @JoinColumn(name = "book_id") 
    private Integer bookId;

    @Column(name = "book_name")
    private String bookName;
}
@Getter
@Entity
@Table(name = "user_books")
public class UserBooks{
    @Id
    @Column(name = "user_book_id")
    private Integer userBookId;
    
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user
    
    @ManyToOne
    @JoinColumn(name = "book_id")
    private Book book;
}
public interface MyRepository extends JPARepository<UserBooks, Integer> {
     @Query("SELECT ub.userName, ub.bookName FROM UserBooks ub JOIN ub.User JOIN ub.Book WHERE userId=?1") //WHAT DO I DO HERE?
     UserBooks getAllBooksByUser(Integer userId);
}
UserBooks.java:

@Getter
@Entity
@Table(name = "users")
public class User {
    @Id
    @OneToMany
    @JoinColumn(name = "user_id")
    private Integer userId;
    
   @Column(name = "user_name")
    private String userName;
}
@Getter
@Entity
@Table(name = "books")
public class Books {
    @Id
    @OneToMany
    @JoinColumn(name = "book_id") 
    private Integer bookId;

    @Column(name = "book_name")
    private String bookName;
}
@Getter
@Entity
@Table(name = "user_books")
public class UserBooks{
    @Id
    @Column(name = "user_book_id")
    private Integer userBookId;
    
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user
    
    @ManyToOne
    @JoinColumn(name = "book_id")
    private Book book;
}
public interface MyRepository extends JPARepository<UserBooks, Integer> {
     @Query("SELECT ub.userName, ub.bookName FROM UserBooks ub JOIN ub.User JOIN ub.Book WHERE userId=?1") //WHAT DO I DO HERE?
     UserBooks getAllBooksByUser(Integer userId);
}
存储库:

@Getter
@Entity
@Table(name = "users")
public class User {
    @Id
    @OneToMany
    @JoinColumn(name = "user_id")
    private Integer userId;
    
   @Column(name = "user_name")
    private String userName;
}
@Getter
@Entity
@Table(name = "books")
public class Books {
    @Id
    @OneToMany
    @JoinColumn(name = "book_id") 
    private Integer bookId;

    @Column(name = "book_name")
    private String bookName;
}
@Getter
@Entity
@Table(name = "user_books")
public class UserBooks{
    @Id
    @Column(name = "user_book_id")
    private Integer userBookId;
    
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user
    
    @ManyToOne
    @JoinColumn(name = "book_id")
    private Book book;
}
public interface MyRepository extends JPARepository<UserBooks, Integer> {
     @Query("SELECT ub.userName, ub.bookName FROM UserBooks ub JOIN ub.User JOIN ub.Book WHERE userId=?1") //WHAT DO I DO HERE?
     UserBooks getAllBooksByUser(Integer userId);
}
公共接口MyRepository扩展了JPARepository{
@查询(“从UserBooks ub JOIN ub.User JOIN ub.Book WHERE userId=?1中选择ub.userName,ub.bookName”)//我在这里做什么?
UserBooks getAllBooksByUser(整数用户ID);
}

我想问两个问题。一个用来获取用户的用户名,另一个用来获取他所有的书。 然后我将创建一个DTO(数据传输对象),它只保留我需要的数据

e、 g:

公共类MyDto
{
字符串用户名;
书单;
//吸气剂二传手
}
然后执行回购以获取此用户的所有书籍:

公共接口BookRepo扩展了JPARepository{
@查询(“选择b.*从u.User\u id=ub.User\u id在u.User\u id=ub.Book\u id中的用户加入用户,其中u.User\u id=1”,nativeQuery=true)
列出getAllBooksByUserId(整数用户ID);
}
服务的一个简单场景是:

getUsernameAndBooks(int-userId)
{
User User=userRepo.findById(userId);
List booksList=bookRepository.getAllBooksByUserId(userId);
返回新的MyDto(user.getUsername(),booksList)
}

映射有问题,不清楚是双向关联还是单向关联。 请注意,在这两种情况下,您都可以获得所需的信息,但查询会发生一些变化

由于您尝试使用了
@OneToMany
注释,因此我假定您正在尝试创建双向关联:

    @Entity
    @Table(name = "users")
    public class User {
        @Id
        @Column(name = "user_id")
        private Integer userId;

        @Column(name = "user_name")
        private String userName;
        
        @OneToMany(mappedBy="user")
        private Set<UserBooks> books = new HashSet<>();
    }

    @Entity
    @Table(name = "books")
    public class Book {
        @Id
        @Column(name = "book_id")
        private Integer bookId;

        @Column(name = "book_name")
        private String bookName;
        
        @OneToMany(mappedBy="book")
        private Set<UserBooks> users = new HashSet<>();
    
    }

    @Entity
    @Table(name = "user_books")
    public class UserBooks{
        @Id
        @Column(name = "user_book_id")
        public Integer userBookId;

        @ManyToOne
        @JoinColumn(name = "user_id")
        public User user;

        @ManyToOne
        @JoinColumn(name = "book_id")
        private Book book;
    }
而查询将变成:

public interface MyRepository extends JPARepository<User, Integer> {
     @Query("FROM User u JOIN FETCH u.books WHERE u.userId=?1")
     User getAllBooksByUser(Integer userId);
}
公共接口MyRepository扩展了JPARepository{
@查询(“从用户u加入获取u.books,其中u.userId=?1”)
用户getAllBooksByUser(整数用户ID);
}
我就让你去冬眠吧