有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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 annotation中的值绑定,但这似乎是不可能的。我可能处理这个错误,所以任何建议都将不胜感激

谢谢

编辑-

玩得很开心。明白这样做是愚蠢的,一种建立类似东西的方法是我所寻找的仍然安全的方法


共 (1) 个答案

  1. # 1 楼答案

    也许你的POJO能帮上忙

    @org.hibernate.annotations.Entity(dynamicInsert = true)