gpt4 book ai didi

java - Spring + hibernate : No property findAddresses found for type UserProfile while fetching a list

转载 作者:行者123 更新时间:2023-12-02 09:23:29 25 4
gpt4 key购买 nike

我在使用 Hibernate 访问数据库上的实体的数据列表时遇到问题。

我有一个实体UserProfile,其中包含一些字段,但最重要的是:

@OneToMany(cascade = CascadeType.ALL)
private Set<Address> addresses;

该类有lombok的@Getter,以及添加地址的方法:

public void addProfileAddress(Address address) {
addresses.add(address);
}

现在,因为我们只需要单向关系,所以 Address 类如下所示:

@Getter
@Entity
@Table(name = "addresses")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@SQLDelete(sql = "UPDATE addresses SET deleted = true, updated_at = current_date WHERE id = ?")
public class Address extends Auditable implements Serializable {

private static final long serialVersionUID = -5034153190245766924L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Setter
@Column(name = "country", nullable = false)
private String country;

@Setter
@Column(name = "state", nullable = false)
private String state;

@Setter
@Column(name = "city", nullable = false)
private String city;

@SuppressWarnings("PMD.AvoidFieldNameMatchingTypeName")
@Setter
@Column(name = "address", nullable = false)
private String address;


public Address(Address address) {}
}

我有一个 UserProfileRepository:

@Repository
public interface UserProfileRepository extends AuditableRepository<UserProfile> {

List<Address> findAddresses(Long id);

}

但是当我尝试运行代码时(使用 GraphQL 请求:

extend type Query {
userProfiles: [UserProfile]
addresses(id: ID): [Address]
userProfile(id: ID): UserProfile
}

使用 GraphQL 查询解析器方法:

@PreAuthorize("hasAuthority('ACCOUNT_OWNER', 'USER')")
public Set<Address> getAddresses(Long id) {
return userProfileRepository.findAddresses(id).stream().map(Address::new).collect(Collectors.toSet());
}

我得到:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with 
name 'userProfileRepository': Invocation of init method failed; nested exception is
java.lang.IllegalArgumentException: Failed to create query for method public abstract
java.util.List
com.l4a.app.infrastructure.database.repository.UserProfileRepository.findAddresses(java.
lang.Long)! No property findAddresses found for type UserProfile!

有人可以帮我解决这个问题吗?我被困住了...

重要编辑:

当我将 Repository 方法重命名为 findByAddresses 时,我得到:

Caused by: org.hibernate.LazyInitializationException: failed to lazily 
initialize a collection of role:
com.l4a.app.domain.userprofile.UserProfile.addresses, could
not initialize proxy - no Session

最佳答案

默认情况下,所有集合都是延迟加载的,这意味着 spring/hibernate 在查询期间不会加载模型。您必须将 JOIN FETCH 添加到您的查询中:

@Query("SELECT addr FROM UserProfile user JOIN FETCH user.addresses addr WHERE user.id = ?1")
Set<Address> findAddresses(Long id);

如果您希望建立单向关系,其中 UserProfile 可以访问 Address,但反之则不然,您可以执行以下操作:

userId添加到Address表和相应的实体:

@Getter
@Entity
@Table(name = "addresses")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@SQLDelete(sql = "UPDATE addresses SET deleted = true, updated_at = current_date WHERE id = ?")
public class Address extends Auditable implements Serializable {

private static final long serialVersionUID = -5034153190245766924L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Setter
@Column(name ="userId", nullable = true)
private Long userId;

@Setter
@Column(name = "country", nullable = false)
private String country;

@Setter
@Column(name = "state", nullable = false)
private String state;

@Setter
@Column(name = "city", nullable = false)
private String city;

@SuppressWarnings("PMD.AvoidFieldNameMatchingTypeName")
@Setter
@Column(name = "address", nullable = false)
private String address;


public Address(Address address) {}
}

创建一个AddressRepository:

@Repository
public interface AddressRepository extends AuditableRepository<Address> {

Set<Address> findByUserId(Long userId);
}

然后您可以从您的方法中获取地址集,如下所示:

@PreAuthorize("hasAuthority('ACCOUNT_OWNER', 'USER')")
public Set<Address> getAddresses(Long id) {
return addressRepository.findByUserId(id);
}

关于java - Spring + hibernate : No property findAddresses found for type UserProfile while fetching a list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58506735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com