假设我有以下实体:
*UserEntities:
@Embeddable
@Data
public class ContactInformation implements Serializable {
@Column()
private String name;
@Column()
private String surname;
}
public class UserEntity {
@Embedded
private ContactInformation contactInformation;
@Column()
@NotEmpty
private String email;
@Column()
@NotEmpty
private String password;
}
- 以及UserHobbyEntity:
public class UserHobbyEntity extends BaseEntity {
@Column(name = )
@NotEmpty
private String hobbyName;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", referencedColumnName = "id")
@OnDelete(action = OnDeleteAction.CASCADE)
private UserEntity userEntity;
}
现在我想让所有用户(使用分页)在不使用@OneToMany
的情况下拥有他/她的爱好,并Map到名为SearchUserModel
的新类:
public class SearchUserModel {
private String userId;
private String name;
private String surname;
private List<String> hobbies;
public SearchUserModel(String userId,
String name, String surname,
List<String> hobbies) {
this.userId = userId;
this.name = name;
this.surname = surname;
this.hobbies = hobbies;
}
}
当我调用下面的repository方法时,spring Boot 说**”Could not determine appropriate instantiation strategy - no matching constructor found and one or more arguments does not define alias for bean-injection”**:
@Repository
public interface UserRepository extends JpaRepository<UserEntity, String> {
@Query("""
SELECT new com.package.to.SearchUserModel(
user.id,
user.contactInformation.name,
user.contactInformation.surname,
(SELECT uh.hobbyName FROM UserHobbyEntity uh WHERE uh.userEntity.id = user.id)
)
FROM UserEntity user
WHERE user.id != :userId
""")
Page<SearchUserModel> getUsersForUser(String userId, Pageable pageable);
}
当我将List<String> hobbies
更改为String hobby
时,它可以工作,但我想获得所有爱好:
public class SearchUserModel {
private String userId;
private String name;
private String surname;
// this is working but i want to get all hobbies for each user
public SearchUserModel(String userId,
String name, String surname,
String hobby) {
this.userId = userId;
this.name = name;
this.surname = surname;
}
}
1条答案
按热度按时间68bkxrlz1#
你不能在jpql表达式的select子句中使用子查询(见此),这解释了错误。
如果你想实现这个结果,你必须声明一对多的关系,但是你可以将它标记为惰性,这样除非显式请求,否则它不会被获取。