由于在抽象中解释我要做什么有点困难,所以我克隆了spring-boot-sample-data-jpa项目,并对其进行了修改,以展示我正在尝试做什么的示例。
我有这些模型类,您将注意到spahotel
和sporthotel
扩展了hotel
实体。
我正在尝试编写一个查询,返回包含spahotel
或sporthotel
的所有城市,其主要运动是给定类型的。
我编写了一个JPQL版本的查询,它有点难看(我不喜欢sport is null
部分来表示它是一家水疗酒店),但似乎返回了我想要的。
但该查询的QueryDsl版本似乎不起作用:
public List<City> findAllCitiesWithSpaOrSportHotelQueryDsl(SportType sportType) {
QCity city = QCity.city;
QHotel hotel = QHotel.hotel;
return queryFactory.from(city)
.join(city.hotels, hotel)
.where(
hotel.instanceOf(SpaHotel.class).or(
hotel.as(QSportHotel.class).mainSport.type.eq(sportType)
)
).list(city);
}
我的测试失败,原因是:
test_findAllCitiesWithSpaOrSportHotelQueryDsl(sample.data.jpa.service.CityRepositoryIntegrationTests) Time elapsed: 0.082 sec <<< FAILURE!
java.lang.AssertionError:
Expected: iterable over [<Montreal,Canada>, <Aspen,United States>, <'Neuchatel','Switzerland'>] in any order
but: No item matches: <Montreal,Canada> in [<Aspen,United States>, <'Neuchatel','Switzerland'>]
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
at sample.data.jpa.service.CityRepositoryIntegrationTests.test_findAllCitiesWithSpaOrSportHotelQueryDsl(CityRepositoryIntegrationTests.java:95)
select city0_.id as id1_0_, city0_.country as country2_0_, city0_.name as name3_0_
from city city0_
inner join hotel hotels1_
on city0_.id=hotels1_.city_id
cross join sport sport2_
where hotels1_.main_sport_id=sport2_.id and (hotels1_.type=? or sport2_.type=?)
我的问题:
JPQL查询的正确转换
String jpql = "select c from City c"
+ " join c.hotels hotel"
+ " left join hotel.mainSport sport"
+ " where (sport is null or sport.type = :sportType)";
是
return queryFactory.from(city)
.join(city.hotels, hotel)
.leftJoin(hotel.as(QSportHotel.class).mainSport, sport)
.where(sport.isNull().or(sport.type.eq(sportType)))
.list(city);
在原始查询中,此属性用法
hotel.as(QSportHotel.class).mainSport
我是QueryDSL的新手,能够在WHERE-in子句中组装具有多个列的查询,如下所示: 我有主要查询的部分: 但我不知道如何实现where子句。如何在QueryDSL中实现这一点? 提前致谢!
使用Query DSL和hibernate(Spring Data JPA)构建查询,如下所示 这里的逻辑很简单:如果有一个与某个人关联的银行帐户,则按银行ID过滤结果。 实体具有一个,它包含整数值。实体可能具有也可能没有
问题内容: 我试图建立一个查询,其中基于用户选择从客户端发送一些字段。我计划根据用户的选择创建一个动态查询。尽管我可以简单地用一些Java代码来完成它,并且让hibernate为我激发该查询并返回结果。 我的问题是,我可以使用内置hibernate机制来做同样的事情。例如我会得到一张地图说 唯一的区别是地图可以包含的值的数量,并基于此我想创建一个查询 提前致谢 问题答案: 通过使用条件,这应该不成
我将Gatling与JDBC feeder一起使用,并希望根据之前请求的响应动态地向JDBC feeder的where子句添加一个参数。这里是我的例子,我试图做一个帖子,创建一个用户,然后让提要使用create user请求返回的userId获取用户生成的UUID,然后用UUID发布一些数据。 我已经核实了以下内容: 1)用户数据确实在表单帖子上正确插入数据库2)用户ID从表单帖子返回3)用户ID
问题内容: 我试图像这样更新我的表: 我可以做一个,但是会发送50多个单独的查询,这非常慢。这就是为什么我希望将其合并为1个大查询。 (我确实为每行使用一个 id ,但是 game_id , x 和 y 的组合才是我用来标识所需行的方法。) 这里描述了来自codeIgniter的update_batch()函数: 使用CodeIgniter更新批处理 是有用的,并且几乎是完美的,但是它仅允许1个单
问题 你希望创建一个字典来构造动态的where子句并且希望能够在查询语句中使用。 解决 >>> import web >>> db = web.database(dbn='postgres', db='mydb', user='postgres') >>> where_dict = {'col1': 1, col2: 'sometext'} >>> db.delete('mytable', whe