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

带条件api的Spring数据jpa查询方法

那博瀚
2023-03-14

我一直在mysql中使用Spring data JPA。我主要使用以下查询方法:


public interface VehicleRepository extends JpaRepository<Vehicle, Long> {

    Vehicle findByRegistrationNumber(String registrationNumber);

    Vehicle findByDriver(Driver driver);

    Vehicle findByNaturalId(String naturalId);


}

但现在,对于一些用例,我想如下所示:


@Repository
public class VehicleCriteriaRepository {

    private final EntityManager entityManager;

    public VehicleCriteriaRepository(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public Vehicle find(String naturalId) {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Vehicle> criteriaQuery = criteriaBuilder.createQuery(Vehicle.class);
        Root<Vehicle> vehicleRoot = criteriaQuery.from(Vehicle.class);

        CriteriaQuery<Vehicle> registrationNumber = criteriaQuery
                .select(vehicleRoot)
                .where(criteriaBuilder.equal(vehicleRoot.get("naturalId"), naturalId));
        Vehicle singleResult = entityManager.createQuery(registrationNumber).getSingleResult();
        return singleResult;
    }
}

我不明白我怎么能同时使用它们。因为如果我想使用criteria api,我必须创建一个具体的类。如果我创建了一个具体的类,我不明白如何使用jpa查询方法,就好像我实现了接口一样,我必须提供一个实现。

谁能帮我一下吗。

共有1个答案

子车勇锐
2023-03-14

您可以使用Spring JPA规范。它们将为您提供在JPA的criteria builder中使用Spring存储库的灵活性。

只需让存储库扩展接口JpaSpecificationExecutor

public interface VehicleRepository extends JpaRepository<Vehicle, Long>, JpaSpecificationExecutor<Vehicle> {
    ....
}

然后,您可以使用规范的匿名实现来查询存储库,或者您也可以实现它,只要最适合您。

匿名实现如下所示。

@Autowired
VehicleRepository vehicleRepository;

// somewhere in some methods
vehicleRepository.findOne((root, criteriaQuery, criteriaBuilder) -> 
    criteriaBuilder.equal(root.get("naturalId"), naturalId)
);
 类似资料:
  • 现在我扪心自问,是不是有什么“点符号”或者其他什么东西让这个案例变得可有可无。在E。例如:本机SQL我会做一些事情,比如创建一个子查询,并从内部投影中选择所有别名值()。 如果有任何建议,我将不胜感激。

  • 我有3个实体在我的数据库。实体A具有主密钥PK-A,实体B具有主密钥PK-B,实体C具有主密钥PK-C。 实体A与实体B具有1对多关系,实体B与实体C具有1对多关系 我想在Spring Data JPA中基于PK-A(实际上是实体B中的外键)查询实体C。有可能吗? 但这行不通。还有什么建议我可以试试吗?

  • 显然,扩展了,是抽象的,继承是, 和 具有 其他原因 。 但生成的SQL是这样的: 在我期待的时候: 请注意 使用另一根- 使用子查询- 将lastName字段上移到主题 使用本机查询 使用实体图 是不能接受的。 我感兴趣的是可以在WHERE子句中直接声明和使用的东西(仅从CriteriaBuilder和/或单个Root生成,就像子句一样)(如果确实存在的话)。

  • 嗨,我想知道如何在谷歌Api v4查询中包含条件。 B='新闻 我是否将条件包含在范围中或作为附加请求参数? 我目前正在使用 收到https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values:batchGet 和 POSThttps://sheets.googleapis.com/v4/spreadsheets/{spre

  • 谁能告诉我@Query注释将支持数据库独立性查询机制 例子: 如果我写这个查询,它会支持所有的数据库,如Mysql、oracle、postgres。 我在spring data jpa参考文档站点中发现了类似的内容 这意味着如果我编写nativeQuery=true,它将被视为本机查询,如果不编写,它将表现为Spring data jpa特定查询,或者它将如何表现请澄清。

  • 我正在努力使用JPA标准API来为我的数据结构制定一个查询。好的,我的实体如下。我有用户和组(两者共享一个公共的基类OrgEntity)。从逻辑上讲,用户当然可以是多个组中的成员。最后,我有一个表示任务的实体,它有一个潜在所有者的列表(可以是单个用户,也可以是整个组)。域模型总结在下面,是给出的,所以我不能改变它。 查询的起点是User的单个实例。我想知道用户是潜在所有者的所有任务(无论用户是直接