如何为基于当前用户查找 class 的 CRUD 存储库方法编写自定义查询?
How to write custom query for CRUD repository method that finds class based on current user?
我正在使用 jhipster 创建一个 Spring-boot 应用程序,其中用户拥有 moneyAccounts。目前,当用户登录到应用程序时,他们可以看到所有用户的所有 moneyAccounts,我正在添加一个方法,该方法将只查找当前登录用户的帐户。如何制定仅根据当前登录用户查找帐户的查询?
我已经尝试过类似于此 中的查询,但我的构建不会 运行 除非我使用本机查询格式。我重新制定了本机格式的查询,如下所示。
@Query(value = "select * from MONEY_ACCOUNT where MONEY_ACCOUNT.USER_DETAILS_ID = ?#{principal?.id}", nativeQuery = true)
List<MoneyAccount> findByUserIsCurrentUser();
上述查询在我的页面上产生了 500 错误。欢迎任何建议!
实体:
@Entity
@Table(name = "jhi_user")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class User extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;
@NotNull
@Pattern(regexp = Constants.LOGIN_REGEX)
@Size(min = 1, max = 50)
@Column(length = 50, unique = true, nullable = false)
private String login;
@JsonIgnore
@NotNull
@Size(min = 60, max = 60)
@Column(name = "password_hash", length = 60, nullable = false)
private String password;
@Size(max = 50)
@Column(name = "first_name", length = 50)
private String firstName;
@Size(max = 50)
@Column(name = "last_name", length = 50)
private String lastName;
@Email
@Size(min = 5, max = 254)
@Column(length = 254, unique = true)
private String email;
@NotNull
@Column(nullable = false)
private boolean activated = false;
@Size(min = 2, max = 6)
@Column(name = "lang_key", length = 6)
private String langKey;
@Size(max = 256)
@Column(name = "image_url", length = 256)
private String imageUrl;
@Size(max = 20)
@Column(name = "activation_key", length = 20)
@JsonIgnore
private String activationKey;
@Size(max = 20)
@Column(name = "reset_key", length = 20)
@JsonIgnore
private String resetKey;
@Column(name = "reset_date")
private Instant resetDate = null;
@JsonIgnore
@ManyToMany
@JoinTable(
name = "jhi_user_authority",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")})
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@BatchSize(size = 20)
private Set<Authority> authorities = new HashSet<>();
//getters and setters etc.
存储库:
@Repository
public interface MoneyAccountRepository extends JpaRepository<MoneyAccount, Long> {
@Query(value = "select * from MONEY_ACCOUNT where MONEY_ACCOUNT.USER_DETAILS_ID = #{principal.id}", nativeQuery = true)
List<MoneyAccount> findByUserIsCurrentUser();
}
你在校长面前少了#,比如:
"select * from MONEY_ACCOUNT where MONEY_ACCOUNT.USER_DETAILS_ID = #{principal.id}"
阅读此 tuto 了解更多信息。
我正在使用 jhipster 创建一个 Spring-boot 应用程序,其中用户拥有 moneyAccounts。目前,当用户登录到应用程序时,他们可以看到所有用户的所有 moneyAccounts,我正在添加一个方法,该方法将只查找当前登录用户的帐户。如何制定仅根据当前登录用户查找帐户的查询?
我已经尝试过类似于此
@Query(value = "select * from MONEY_ACCOUNT where MONEY_ACCOUNT.USER_DETAILS_ID = ?#{principal?.id}", nativeQuery = true)
List<MoneyAccount> findByUserIsCurrentUser();
上述查询在我的页面上产生了 500 错误。欢迎任何建议!
实体:
@Entity
@Table(name = "jhi_user")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class User extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;
@NotNull
@Pattern(regexp = Constants.LOGIN_REGEX)
@Size(min = 1, max = 50)
@Column(length = 50, unique = true, nullable = false)
private String login;
@JsonIgnore
@NotNull
@Size(min = 60, max = 60)
@Column(name = "password_hash", length = 60, nullable = false)
private String password;
@Size(max = 50)
@Column(name = "first_name", length = 50)
private String firstName;
@Size(max = 50)
@Column(name = "last_name", length = 50)
private String lastName;
@Email
@Size(min = 5, max = 254)
@Column(length = 254, unique = true)
private String email;
@NotNull
@Column(nullable = false)
private boolean activated = false;
@Size(min = 2, max = 6)
@Column(name = "lang_key", length = 6)
private String langKey;
@Size(max = 256)
@Column(name = "image_url", length = 256)
private String imageUrl;
@Size(max = 20)
@Column(name = "activation_key", length = 20)
@JsonIgnore
private String activationKey;
@Size(max = 20)
@Column(name = "reset_key", length = 20)
@JsonIgnore
private String resetKey;
@Column(name = "reset_date")
private Instant resetDate = null;
@JsonIgnore
@ManyToMany
@JoinTable(
name = "jhi_user_authority",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")})
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@BatchSize(size = 20)
private Set<Authority> authorities = new HashSet<>();
//getters and setters etc.
存储库:
@Repository
public interface MoneyAccountRepository extends JpaRepository<MoneyAccount, Long> {
@Query(value = "select * from MONEY_ACCOUNT where MONEY_ACCOUNT.USER_DETAILS_ID = #{principal.id}", nativeQuery = true)
List<MoneyAccount> findByUserIsCurrentUser();
}
你在校长面前少了#,比如:
"select * from MONEY_ACCOUNT where MONEY_ACCOUNT.USER_DETAILS_ID = #{principal.id}"
阅读此 tuto 了解更多信息。