我想从表“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();
答案 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这样做。