编辑 -
我将添加用例以清除此功能。
用户将选择两个日期 - 开始日期和结束日期 - 然后传递这些日期并用于选择表格(每年都有自己的表格)。在一个用例中,两个给定日期位于同一年,它只是对该表的简单查询。
但是,如果两个日期不同,我将需要加入所有表格(因此2011-2013将连接三个表格进行搜索),因此,我想要动态修复此问题。我知道建立一个像下面这样的查询是违反安全的 - 只是认为类似的东西会起作用。由于系统每年都会获得新表,我也不想为每个案例手动添加许多新查询(2011-2016,2014-2018,2011-2019等)
我有一个问题是,是否可以像下面那样创建一个动态查询,然后将其传递给服务 - >存储库,并将其用作查询?
for (int i = 0; i < yearCondition; i++) {
if (i == 0) {
query += "SELECT md.Device_ID, l.locationRef, " + reportRunForm.getStartDate() + " as 'From Date', "
+ reportRunForm.getEndDate() + " as 'To Date' "
+ "from mData.meterdata" + iDateStart.substring(0, 4)
+ " join MOL2.meters m on device_ID = m.meterUI "
+ "join MOL2.locations l on m.locationID = l.locationID "
+ "join MOL2.meterreg mr on m.meterID = mr.meterID "
+ "where mr.userID = ?1";
}
query += "UNION SELECT md.Device_ID, l.locationRef, " + reportRunForm.getStartDate() + " as 'From Date', "
+ reportRunForm.getEndDate() + " as 'To Date' "
+ "from mData.meterdata" + (Integer.parseInt(iDateStart.substring(0, 4))+i)
+ " join MOL2.meters m on device_ID = m.meterUI "
+ "join MOL2.locations l on m.locationID = l.locationID "
+ "join MOL2.meterreg mr on m.meterID = mr.meterID "
+ "where mr.userID = ?1";
}
我可能对这是如何工作有错误的想法,我知道我可以通过entitymanager创建并持久化查询,但想知道是否可以通过存储库进行查询?
我的想法是我像上面那样构建查询,将其传递给服务然后传递给存储库,并将其作为@Query注释中的值绑定,但这似乎不可能。我很可能接近这个错误,所以任何建议都会受到赞赏。
感谢。
编辑 -
有一个混蛋。理解这样做是非常愚蠢的,建立类似的东西的方法是我正在寻找的仍然是安全的。
答案 0 :(得分:0)
也许在你的POJO之前的这个注释可以帮助
@org.hibernate.annotations.Entity(dynamicInsert = true)
答案 1 :(得分:0)
例如两个表区和选区......
动态查询
query += "select *from constituency c where 1=1";
if(constituencyNumber!=null)
query +=" and c.constituency_number like '"+constituencyNumber+"%'";
query += " group by c.district_id";
OR
select *from constituency c where (c.constituency_number is null or c.constituency_number like '1%') group by c.district_id;