当前位置: 首页 > 知识库问答 >
问题:

JPA存储库属性表达式

松博耘
2023-03-14

在我的Spring Boot应用程序(基于JHipster 4)中,我试图使用属性表达式根据Spring文档中描述的相关实体的属性来过滤我的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-方法。查询属性表达式

我想得到所有的约会,在他们的约会计划中有一个特定的雇员帐户,但只收到一个空列表。

@Repository
public interface AppointmentRepository extends JpaRepository<Appointment, Long> {

        public List<Appointment> findByScheduledAppointmentsEmployeeAccountsId(Long id);
}

相关实体及其关系:

@Entity
@Table(name = "appointment")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Appointment implements Serializable {

    @OneToMany(mappedBy = "appointments")
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<AppointmentSchedule> scheduledAppointments = new HashSet<>();

...

}

@Entity
@Table(name = "appointment_schedule")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class AppointmentSchedule implements Serializable {

    @ManyToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "appointment_schedule_employee_accounts", joinColumns = @JoinColumn(name = "appointment_schedules_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "employee_accounts_id", referencedColumnName = "id"))
    private Set<EmployeeAccount> employeeAccounts = new HashSet<>();

...

}

@Entity
@Table(name = "employee_account")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class EmployeeAccount implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

...

}

执行查询时hibernate控制台输出:

Hibernate: select appointmen0_.id as id1_1_, appointmen0_.institution_id as institut2_1_, appointmen0_.user_account_id as user_acc3_1_ from appointment appointmen0_ where appointmen0_.user_account_id=?

如果有人能告诉我我做错了什么,我将不胜感激。

编辑:请注意,约会表不包含约会日程的列,因为它是一个OneToMany关系。也许这就是原因?我以为JPA会帮我处理这个逻辑。。。

表结构:

APPOINTMENT;
ID      ...

APPOINTMENT_SCHEDULE;
ID      APPOINTMENTS_ID    ...

APPOINTMENT_SCHEDULE_EMPLOYEE_ACCOUNTS;
EMPLOYEE_ACCOUNTS_ID    APPOINTMENT_SCHEDULES_ID

EMPLOYEE_ACCOUNT;
ID    ...

编辑2:我能够解决这个问题。这是一个典型的PEBCAK错误,因为我不小心在我的服务类facepalm中调用了一个类似命名的方法。非常感谢所有帮助我的人!Gaurav Srivastav和Dean的答案都有效,但不是必需的,因为问题中的原始代码已经有效

共有2个答案

舒嘉德
2023-03-14

是的,将单词In添加到您的方法并提供Set

Set<Person> findByScheduledAppointmentsEmployeeAccountsIdIn(Set<Long> employeeIds);

梁德馨
2023-03-14

在引用嵌套字段之前,必须使用下划线。尝试:

public List<Appointment> findByScheduledAppointments_EmployeeAccounts_Id(Long id)
 类似资料:
  • 我是Spring Data JPA的新手。我试图为存储库创建一个自定义方法,但是它确实抛出了一个异常。以下是我目前的实现: 这是我启动应用程序时发生的异常(我正在使用 Spring 启动)。

  • 问题内容: 关于Spring JPA存储库事务性的1个快速问题。我有未标记为事务性的服务,并调用了Spring JPA存储库方法 它被定义为 问题是它失败,并且“ 没有EntityManager,当前线程没有可用的实际事务- 无法可靠地处理’remove’调用;嵌套异常是javax.persistence.TransactionRequiredException “异常。 好的,我可以通过将服务

  • 关于Spring JPA存储库事务性的1个快速问题。我有一个未标记为事务性的服务,并调用Spring JPA存储库方法 好的,我可以通过标记服务或deleteByEmail(..)来解决它方法作为事务性的,但我就是不明白为什么它现在会崩溃。Spring文档明确指出“存储库实例上的CRUD方法在默认情况下是事务性的。”(http://docs.spring.io/spring-data/jpa/do

  • 对于一般的 spring JpaRepository DAO(无 spring-boot),如果接口扩展了一个自定义接口,spring 会把接口方法误认为是对象的属性。 例如 这是一个简化。扩展了,其中包含一个方法。 注意:< code>localDateTime不是< code>User的字段。 在运行时, 会将 ?)误认为字段,并抛出这样的异常: 环境: 如何解决这个问题?(能够或无法修改的代

  • 我有一个springboot项目,为了执行请求,我正在连接到我的mysql数据库。我有一个实体ExportBatch: 我在ExportBatchRepository中定义了一个新方法: 在我的控制器里,我是这样做的: 当我调用“/GetLastBatchsProblemes”时会遇到这个异常:java.lang.ClassCastException:[Ljava.lang.Object;不能强制

  • 我试图获取一个列表从数据库和findAll()返回空列表。我有多个jpa存储库,但只有一个不工作。这是代码: 这就是实体: 当我调用product类别epository.findAll()时,它返回空列表,因此我在数据库中有许多条目。谢谢你的帮助!