Spring JPA存储库使用正确的属性名称失败,并且使用错误的名称工作
我有一个属性名为isChecked with is boolean type的类。在Jpa存储库中,我编写了一个方法来查找所有isChecked=false的行Spring JPA存储库使用正确的属性名称失败,并且使用错误的名称工作,spring,jpa,repository,Spring,Jpa,Repository,我有一个属性名为isChecked with is boolean type的类。在Jpa存储库中,我编写了一个方法来查找所有isChecked=false的行 public interface ReservationReminderRepository extends JpaRepository<ReservationReminder, Integer> { ReservationReminder findByReservationReminderId(Integer id);
public interface ReservationReminderRepository extends JpaRepository<ReservationReminder, Integer> {
ReservationReminder findByReservationReminderId(Integer id);
//@Query("select r from ReservationReminder r where r.isChecked = :checked")
List<ReservationReminder> findByChecked(boolean checked);
}
问题似乎与该物业的命名有关 当您告诉Spring查找
findByChecked
时,属性名为isChecked
您可以尝试使用findByIsChecked
并将getter更改为isChecked
但实际上,我会将属性更改为
checked
,将getter更改为isChecked
,并保持jpa查询方法不变。似乎问题与该属性的命名有关
当您告诉Spring查找findByChecked
时,属性名为isChecked
您可以尝试使用findByIsChecked
并将getter更改为isChecked
但实际上,我会将属性更改为
checked
,将getter更改为isChecked
,并保留jpa查询方法的原样。由于您的注释位于方法上,因此您的属性命名为checked
,而不是isChecked
。如果注释位于字段上,则将对其进行isChecked
。因此,它的实际效果与JPA应该的一样。在方法上设置注释将打开AccessType.PROPERTY
,而不是默认的AccessType.FIELD
。您的意思是:@Access(AccessType.FIELD)public class reservationrementer
您不能混合字段和属性访问。。。它是字段或属性,但不是两者都是。只需将注释移到字段而不是getter。对不起,我不明白您的意思。请粘贴一个egxmaple,使其看起来像您的注释位于属性上,而不是自动启用的字段AccesType.PROPERTY
。。。如上所述,只需将注释移动到字段而不是属性(即getter/setter!)。由于注释位于方法上,因此您的属性被命名为已选中,而不是已选中。如果注释位于字段上,则将对其进行isChecked
。因此,它的实际效果与JPA应该的一样。在方法上设置注释将打开AccessType.PROPERTY
,而不是默认的AccessType.FIELD
。您的意思是:@Access(AccessType.FIELD)public class reservationrementer
您不能混合字段和属性访问。。。它是字段或属性,但不是两者都是。只需将注释移到字段而不是getter。对不起,我不明白您的意思。请粘贴一个egxmaple,使其看起来像您的注释位于属性上,而不是自动启用的字段AccesType.PROPERTY
。。。如上所述,只需将注释移动到字段而不是属性(即getter/setter!)。
Caused by: java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [isChecked] on this ManagedType [com.carwash.domains.ReservationReminder]
at org.hibernate.jpa.internal.metamodel.AbstractManagedType.checkNotNull(AbstractManagedType.java:128)
at org.hibernate.jpa.internal.metamodel.AbstractManagedType.getAttribute(AbstractManagedType.java:113)
at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:566)
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.getTypedPath(JpaQueryCreator.java:334)
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.build(JpaQueryCreator.java:277)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate(JpaQueryCreator.java:182)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:109)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:49)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:109)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:88)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:73)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.<init>(PartTreeJpaQuery.java:118)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.<init>(PartTreeJpaQuery.java:241)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:68)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:103)
... 104 more
package com.carwash.domains;
import javax.persistence.*;
import java.util.Date;
/**
* Created by mbi on 01.03.2017.
*/
@Entity
public class ReservationReminder {
private int reservationReminderId;
private Reservation reservation;
private boolean isChecked;
private Date checkedDate;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int getReservationReminderId() {
return reservationReminderId;
}
public void setReservationReminderId(int reservationReminderId) {
this.reservationReminderId = reservationReminderId;
}
@OneToOne(mappedBy = "reservationReminder")
public Reservation getReservation() {
return reservation;
}
public void setReservation(Reservation reservation) {
this.reservation = reservation;
}
public boolean getChecked() {
return isChecked;
}
public void setChecked(Boolean checked) {
isChecked = checked;
}
public Date getCheckedDate() {
return checkedDate;
}
public void setCheckedDate(Date checkedDate) {
this.checkedDate = checkedDate;
}
@Override
public String toString() {
return "ReservationReminder{" +
"reviewId=" + reservationReminderId +
", isChecked=" + isChecked +
", checkedDate=" + checkedDate +
'}';
}
public ReservationReminder() {
}
public ReservationReminder(Boolean isChecked, Date checkedDate) {
this.isChecked = isChecked;
this.checkedDate = checkedDate;
}
public ReservationReminder(int reservationReminderId, Reservation reservation, boolean isChecked, Date checkedDate) {
this.reservationReminderId = reservationReminderId;
this.reservation = reservation;
this.isChecked = isChecked;
this.checkedDate = checkedDate;
}
}