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

使用queryDSL和使用LockMode实现的spring-data-jpa查找最后一项

冯茂实
2023-03-14

我想用Spring-Data-JPA(Hibernate实现)和QueryDSL(type safe)从表“product”中找到最后插入的项,以生成sql:SELECT*from product ORDER BY id DESC LIMIT 1

我已经用@transactional从服务调用了findLast(),并希望设置LockMode(lockModeType.pessimistic_write),并在此SQL查询中添加“Select..FOR Update”。

public class ProductRepositoryImpl extends QueryDslRepositorySupport implements ProductRepositoryCustom {

    public ProductRepositoryImpl() {
        super(Product.class);
    }

    //SELECT * FROM PRODUCTS ORDER BY ID DESC LIMIT 1
    @Override
    public Product findLast() {
        QProduct product = QProduct.product;
        return from(product).orderBy(product.id.desc()).limit(1L).fetchOne();
    }
}

这是生成的SQL

Hibernate:从Product0_.ID选择id11,Product0_.Description选择description21,Product0_.Price选择price31,Product0_.ProductStatus选择productStatus41,Product0_.Quantity选择quantity51,其中行数<=?

问题:在扩展org.springframework.data.jpa.repository.support.querydslrepositorysupport的存储库中添加setLockMode()的最佳方法是什么?

我试过这个,但它返回对象,需要强制转换(产品):

getQuerydsl().createQuery(product)
.setLockMode(LockModeType.PESSIMISTIC_WRITE).orderBy(product.id.desc()).limit(1L).fetchOne();

共有1个答案

鞠子轩
2023-03-14

试一下这部分代码,我认为它的工作原理是这样的:

  QProduct product = QProduct.product;
 return (Product)getQuerydsl().createQuery(product)
.setLockMode(LockModeType.PESSIMISTIC_WRITE).orderBy(product.id.desc())
.limit(1L).fetchOne();

Hibernate将生成以下查询:Hibernate:select*from(select product0_.id as id1_1_,......from PRODUCTS product0_order by product0_.id desc)其中rownum<=?

Hibernate:选择Product0_.id作为id1_1_,....from PRODUCTS product0_where product0_.id=?用于更新

 类似资料:
  • 我使用了spring data,jpa和querydsl,并学习了如何编写简单、漂亮的查询以左联接两个表。假设我有一个Project实体和一个Task实体,在Project中定义了OneToMany关系,我想做如下操作: 在JPQL中,应为: 我有一个ProjectRepository接口,它扩展了JPararePository和QuerydsLPredicateExecutor。使我能够访问方法

  • 问题内容: 我是Spring数据JPA的新手,正在尝试了解如何最好地将其与QueryDSL结合使用。没有QueryDSL,我将可以在SpringData接口中使用@Query注释简单地创建任何查询。 为了获得与使用QueryDSL相同的经验,从我可以看到的角度来看,我需要创建自己的自定义存储库实现,并使我的repo接口扩展我的自定义实现接口,或者将我的所有QueryDSL查询放在包装我的repo的

  • 问题内容: 我如何才能达到与以下代码等效的效果: …但是使用Spring和Spring-Data-JPA批注? 我现有代码的基础是: 但是我不知道如何指定方法中的所有操作都应使用悲观锁集。 有一个Spring Data JPA批注,允许您设置,但是我不知道将其放在方法上是否有效。听起来更像是的注解,因为Javadoc说: org.springframework.data.jpa.repositor

  • 我在使用与Spring Data JPA集成的QueryDSL时遇到了一个奇怪的行为: 我在Project和Person之间有ManyToOne关系。如果我通过所有者ID(外键)获取属于用户的所有项目,一切都按预期工作: 生成的查询: 但是,假设我们想通过一个不是外键的字段(例如所有者的姓名)获取属于一个人的所有项目: 在这些情况下,表Person被不必要地连接了两次(请注意person1_和pe

  • 我希望在QueryDSL JPA中执行此SQL请求 为了在表中找到重复的行,我应该执行这个请求。但使用QueryDSL,我无法找到编写此代码的方法。 有什么建议吗? 多谢问候,

  • 我有一个表,其中存储了里程碑(id、描述、日期),并且给定了一些事件日期,我希望找到最接近该日期的里程碑。 我正在使用Spring Data JPA,但我似乎不知道该怎么做。根据可用的函数,似乎没有任何本身可用的东西来查找最接近的日期。目前,我想到的最好的主意是使用原始sql,类似于 然后,我会在我的存储库上有一个函数,例如 我对这种方法的主要关注点是,我必须依赖于特定于DBMS的函数来执行日期差