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