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

Spring data JPA。找到

林元明
2023-03-14

在我的Spring项目中,我有一个通常的Spring Data JPA存储库。

@Repository
public interface EventRepository extends CrudRepository<Event, Long> {
  List<Event> findByOriginalIdIn(Collection<String> originalEventIds);
  ...

我以前使用的方法是findByOriginalIdIn,效果很好。但情况发生了变化,我需要使用对的集合来处理相同的请求,以查找和过滤正确的事件。

我的替代方法应该处理下一个逻辑:find by(originalId1和originalCalendarId1)或(originalId2和originalCalendarId2)或(originalId..N和originalCalendarId..N)或

是否可以使用选择性公开CRUD方法来处理此请求?如果是,请给我举个例子好吗?

共有3个答案

淳于博
2023-03-14

我建议将QueryDSL与Spring JPA结合使用,使您的实现更加简单。

使用QueryDSL,您可以轻松构建谓词(只有条件)并在查询中使用它。在您的情况下,它可能如下所示。请参阅链接:Spring Data JPA教程:使用Querydsl创建数据库查询,了解如何将QueryDSL与Spring Data JPA一起使用。

在你的情况下,在给定的条件下,

find by (originalId1 AND originalCalendarId1) OR (originalId2 AND originalCalendarId2) OR (originalId..N AND originalCalendarId..N) OR

我不明白例如originalId1/originalCalendarId1是否应该等于任何值。比如说,为了简单和解释,它们等于某个值。

import com.mysema.query.BooleanBuilder;
import com.mysema.query.types.Predicate;

public class EventPredicates {

    public static Predicate getAllEventsByOrginalIds(String[] originalIds, String[] originalCalendarIds) {
        QEvent event = QEventEntity.event;

        BooleanBuilder builder = new BooleanBuilder();

        //assuming both arrays are of same size.
        for (int idx = 0; idx < originalIds.length; idx++) {
            builder.or(event.originalIds[0].eq.(someValue)).and(event.originalCalendarIds[0].eq.(someCalValue));
        }
        return builder;
    }
}

但是,您的存储库接口应该扩展QueryDslPredicateExecitor

在您的服务方法中,假设EventRepository声明如下,您可以进行如下调用:

@Autowired
EventRepository eventRepository;

public void someMethod(){

    ...
    List<Events> events = eventRepository.findAll(EventPredicates.getAllEventsByOrginalIds(originalIdsArr, originalCalendarIdsArr));
    ...

}

顺便说一句,QueryDSL使实现不同标准(从简单到复杂)变得非常容易。有关如何使用它,请参阅上面的链接。

希望这有帮助。

计光赫
2023-03-14

尝试使用具有以下限制的条件:

Criteria criteria = session.createCriteria(Event.class)
                    .add(Restrictions.in("id", values));
上官树
2023-03-14

为了不创建自定义存储库,我建议使用Spring数据JPA规范。下面是一个草稿示例。

       class Specification1 implements Specification<Event> {            
            private final List<Pair<String, String>> pairs;

            public Specification1(List<Pair<String, String>> pairs) {
                this.paris = pairs;
            }

            @Override
            public Predicate toPredicate(Root<Event> root, CriteriaQuery<?> query, CriteriaBuilder cb) {


                Predicate[] as = pairs.stream().map(pair -> {
                    return cb.and(cb.equal(root.get("originalId2"), pair.getKey())),cb.equal(root.get("originalCalendarId2"), pair.getKey());
                }).toArray(Predicate[]::new);

                return cb.or(as);
            }
        }


        userRepository.findAll(new Specification1(...));

此外,存储库还必须扩展JpaSpecificationExecutor。

 类似资料:
  • 我只想不使用xml,所以我需要非xml替代这些设置。这是我的POM。

  • 我的项目中的三个模型对象(本文末尾的模型和存储库片段)之间确实存在关系。 当我调用时,它会触发三个select查询: (“sql”) (对我来说)那是相当不寻常的行为。在阅读Hibernate文档后,我认为它应该始终使用连接查询。当类中的更改为时,查询没有区别(使用附加选择进行查询),当更改为时,城市类的查询也一样(使用JOIN进行查询)。 当我使用抑制火灾时,有两种选择: 我的目标是在所有情况下

  • SpringDataJpa中 Specification怎样使用in查询 实体类Menu.java如下 想通过roles属性做in查询,代码如下 错误如下: Parameter value [com.appmtce.pojo.entity.role.Role@20f81e2a] did not match expected type [java.util.Collection (n/a)] 我的S

  • 我正在使用100个实体(使用JHipster)设置一个新的Spring Boot API,我的问题是:鉴于我有一组存储库层方法,我希望我的所有存储库都能够调用这些方法。 我已经尝试制作所有接口来扩展('RepositoryQuery'是我默认的自定义接口名称后缀),然后使用特定于实体的类。请注意,所有的类扩展了一个泛型实现类,名为。 请注意,给定正则表达式中的“.*”代表我的持久实体集中的任何实体

  • 如何使用Spring Rest Controller和Spring Data JPA仅更新从@刚体传递的实体属性? 员工实体: 服务类方法: 请求体: Hibernate更新查询: Spring Data JPA正在尝试将company_id设置为空以进行更新,即使我没有将其传递给请求体?但是如果我从数据库中得到实体,使用employee_id传递,然后如果我试图保存(),那么它的工作正常。 我想

  • 我目前正在开发一个具有核心模块和不同“扩展”模块的应用程序。核心模块包括基于Spring配置类的JPA配置以及一些“基本”实体及其存储库,这些实体和存储库将在“扩展”模块中使用。扩展模块包含额外的实体类和JPARepositories。启动扩展模块的JUnit测试时,我遇到以下错误: 为了做到这一点,我尝试了三种不同的方法: 创建了一个名为coreEntityManager和setPackages

  • 我想根据我的输入选择列(列表 我知道要选择不同的特定列,我可以使用@Query("SELECT DISTINCT name OF TABLE"),但是,我想给用户选择他们想要的列的灵活性。列表

  • 我在SQLSerever中有一个数据库表,其中包含一些数据(最高id为360)。 现在,我想使用Spring数据JPA将新记录插入到这个表中。 有没有一种方法可以使新记录的id以增量方式跟随存量数据的id(即361、362等)? 寻找一种不会将我绑定到当前数据库的解决方案(即,不应阻止我将来无缝切换到另一个数据库)