我正在處理一個涉及 Hibernate 和 Spring Data JPA 的 Spring Boot 專案,我在嘗試使用按方法名稱查詢的查詢來實作查詢時遇到以下問題。
我試著詳細解釋一下我的情況:
我有這個名為TransactionStatusLog的主要物體類:
@Entity
@Table(name = "transaction_status_log")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class TransactionStatusLog {
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column(name = "reason")
private String reason;
@Column(name = "is_active")
Boolean isActive;
@Column(name = "created_at",columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;
@ManyToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "transaction_id_fk", referencedColumnName = "id")
private TransactionLog transactionLog;
@ManyToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "transaction_status_type_id_fk", referencedColumnName = "id")
private TransactionStatusType transactionStatusType;
// The admin that changes the status:
@OneToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "user_id_fk", referencedColumnName = "id")
private User user;
}
如您所見,它包含這種多對一的關系:
@ManyToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "transaction_id_fk", referencedColumnName = "id")
private TransactionLog transactionLog;
在TransactionLog物體類代碼之后:
@Entity
@Table(name = "transaction")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class TransactionLog implements Serializable {
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@ManyToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "source_user_fk", referencedColumnName = "id")
//@JsonManagedReference(value = "sourceUser")
private User sourceUser;
@ManyToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "destination_user_fk", referencedColumnName = "id")
private User destinationUser;
@ManyToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "source_wallet_fk", referencedColumnName = "id")
private Wallet sourceWallet;
@ManyToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "destination_wallet_fk", referencedColumnName = "id")
private Wallet destinationWallet;
@Column(name = "notes")
private String notes;
@Column(name = "timestamp",columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
@Column(name = "amount")
private BigDecimal amount;
@ManyToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "log_type_fk", referencedColumnName = "id")
//@Column(name = "log_type_fk")
private LogType logType;
@ManyToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "fk_network", referencedColumnName = "id")
private Network network;
@ManyToOne
@EqualsAndHashCode.Exclude // Needed by Lombock in "Many To One" relathionship to avoid error
@JoinColumn(name = "fk_chain", referencedColumnName = "id")
private Chain chain;
}
然后我有了這個在我的主要TransactionStatusLog物體類上作業的存盤庫介面。
public interface TransactionStatusLogRepository extends JpaRepository<TransactionStatusLog, Integer>, JpaSpecificationExecutor {
TransactionStatusLog findById(String id);
List<TransactionStatusLog> findByTransactionLog_Id(Integer transactionId);
List<TransactionStatusLog> findByIsActiveAndTransactionLog_Id(Integer transactionId);
我創建了最后一個方法定義:
List<TransactionStatusLog> findByIsActiveAndTransactionLog_Id(Integer transactionId);
嘗試實作以下查詢:找到所有具有以下內容的TransactionStatusLog:
- 值為true的布爾 isActive欄位
- 并具有具有特定 ID 值的TransactionLog (第二個物體類)。
最后我創建了這個 JUnit 測驗方法來測驗這個存盤庫查詢:
@Test
@Order(3)
@Transactional
public void findByIsActiveAndTransactionLog_IdTest() {
List<TransactionStatusLog> result = this.transactionStatusLogRepository.findByIsActiveAndTransactionLog_Id(37);
assertTrue(result.size() == 1, "The result contains 1 tactive transaction status changes related to the transaction having ID: 37");
}
問題是運行這個測驗方法(它沒有啟動,因為我的 Spring Data JPA 按名稱方法定義查詢似乎是錯誤的)我在我的堆疊跟蹤中獲得了這個例外:
Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List com.easydefi.users.repository.TransactionStatusLogRepository.findByIsActiveAndTransactionLog_Id(java.lang.Integer)! Reason: Failed to create query for method public abstract java.util.List
我的代碼有什么問題?我該如何嘗試修復它?(如果按名稱方法查詢對于這樣的用例來說過于復雜,也可以使用 JPQL)
uj5u.com熱心網友回復:
List<TransactionStatusLog> findByIsActiveAndTransactionLog_Id(Integer transactionId);
應該接受兩個引數。一為isActive一為transactionLogId。
正確的形式是:
List<TransactionStatusLog> findByIsActiveAndTransactionLog_Id(boolean isActive, Integer transactionId);
然后呼叫:
List<TransactionStatusLog> result = transactionStatusLogRepository.findByIsActiveAndTransactionLog_Id(true, 37);
uj5u.com熱心網友回復:
您可以通過添加“True”并洗掉下劃線再試一次。它應該看起來像->
List<TransactionStatusLog> result = this.transactionStatusLogRepository.findByIsActiveTrueAndTransactionLogId(37);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/451115.html
