【问题标题】:Spring repository interface: query methods by typeSpring存储库接口:按类型查询方法
【发布时间】:2015-04-13 14:29:19
【问题描述】:

我想知道是否可以使用 springs'query methods 指定特定的子类型。

例如,如果有MailUserChatUserextend UserInheritanceType.SINGLE_TABLE - 我可以找到所有MailUsers 和PersonRepository 吗?

或者我可以在多个类extend User 的场景中找到所有Users,不包括所有MailUsers?

public interface PersonRepository extends Repository<User, Long> {

  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
...
}

【问题讨论】:

  • 您的数据库表是什么样的?您使用的是哪种继承映射?
  • 哎呀,忘了说@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
  • 可以通过判别器选择吗?
  • AFAIK,没有。但是您可以简单地创建一个 ChatUserRepository 和一个 MailUserRepository。
  • 可能在这个简约的例子中。在我的用例中,我有 22 个子类型,需要找到 21 个子类型,不包括一个。

标签: spring spring-data spring-data-jpa


【解决方案1】:

您无法使用基于方法名称的自动查询创建来做到这一点,Spring Data 不支持它(有关支持的表达式,请参阅here)。但是,您可以 use @Query 手动指定 JPQL 查询,并在 WHERE 子句中使用 TYPE(entity) 运算符来缩小到特定实体类型。请参阅JPA spec4.6.17.5 实体类型表达式

实体类型表达式可用于限制查询多态性。 TYPE 运算符返回参数的确切类型。

[...]

例子:

SELECT e
FROM Employee e
WHERE TYPE(e) IN (Exempt, Contractor)

SELECT e
FROM Employee e
WHERE TYPE(e) IN (:empType1, :empType2)

SELECT e
FROM Employee e
WHERE TYPE(e) IN :empTypes

SELECT TYPE(e)
FROM Employee e
WHERE TYPE(e) <> Exempt

【讨论】:

    猜你喜欢
    • 2019-06-10
    • 2021-02-24
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2021-04-16
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多