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

时间:2017-03-08 16:54:11

标签: hibernate spring-data-jpa querydsl

我想从表“product”中找到最后插入的项目,使用Spring-Data-JPA(Hibernate实现)和QueryDSL(类型安全)来生成SQL:SELECT * FROM product ORDER BY id DESC LIMIT 1

我使用@Transactional从Service调用findLast()并想要setLockMode(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:select * from(选择product0_.id为id11,product0_.description为description21,product0_.price为price31,product0_.productStatus为productStatus41,product0_.quantity为quantity51,来自PRODUCTS product0 order by product0.id desc)其中rownum< =?

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

我试过这个但是它返回了Object并且需要强制转换(Product):

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

1 个答案:

答案 0 :(得分:2)

尝试使用这部分代码,我认为它会像那样:

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

Hibernate将生成以下查询: Hibernate:select * from(选择product0_.id为id1_1_,......来自PRODUCTS product0_ order by product0_.id desc)其中rownum< =?

Hibernate:选择product0_.id为id1_1_,....来自PRODUCTS product0_,其中product0_.id =?更新

注意:有两个SQL查询,只能通过ID锁定行。 问题是结构性的,最好分开查询而不是让Hibernate这样做。