JPQL Create" Dynamic"查询在存储库中执行

时间:2016-08-12 11:12:21

标签: java sql spring spring-data-jpa jpql

编辑 -

我将添加用例以清除此功能。

用户将选择两个日期 - 开始日期和结束日期 - 然后传递这些日期并用于选择表格(每年都有自己的表格)。在一个用例中,两个给定日期位于同一年,它只是对该表的简单查询。

但是,如果两个日期不同,我将需要加入所有表格(因此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注释中的值绑定,但这似乎不可能。我很可能接近这个错误,所以任何建议都会受到赞赏。

感谢。

编辑 -

有一个混蛋。理解这样做是非常愚蠢的,建立类似的东西的方法是我正在寻找的仍然是安全的。

2 个答案:

答案 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;