【问题标题】:How to add selection criteria dyanmically in Java or SQL如何在 Java 或 SQL 中动态添加选择条件
【发布时间】:2016-05-13 23:33:12
【问题描述】:

我正在尝试实现一个功能,我必须使用输入参数值查询数据库。输入值是可选的。

例如

我有一个表学生,有以下字段

a)student_id b)student_roll_no c)student_first_name d)student_last_name ..等

我需要编写一个 dao 层函数,以便根据输入条件或参数检索学生详细信息。

1) 如果 Input 只包含 student_id 那么查询应该是 select * from student where student_id = :inputStudentId

2) 如果 Input 包含 student_id, firstName 那么查询应该是 select * from student where student_id = :inputStudentId and first_name = :inputFirstName

与其他输入参数一样,请注意输入参数可以是 0 到 n 大小

请建议最好的方法是什么? 我不想添加空检查并附加非空参数的查询。我想在 Java 或 sql(命名查询)中尝试一些合理且合乎逻辑的东西

我正在使用 java1.6 和休眠

【问题讨论】:

  • 您是在问如何构建String?如果是这样,请使用StringBuilder。 --- 为了获得最佳质量的答案,您应该展示如何您的 DAO 方法获取输入标准,以及您迄今为止尝试过的内容,即展示您拥有的代码。
  • Andreas 我不是在问如何构建一个字符串,我会在 DAO 函数中获取这些值,例如 hentStudentInfo(studentId, firstName, lastName ......)
  • 但是您的整个问题似乎都围绕着如何构建 SQL 语句(String),具体取决于您的输入。 --- 另外,不要在评论中显示代码,编辑问题。 --- 参数的类型是什么?您如何检测是否给出了值? ——不回答。编辑问题并澄清它。

标签: java sql hibernate


【解决方案1】:

如果您使用 Hibernate,您可以使用 HSQL 以下列方式执行此操作:

query=em.createQuery("SELECT s FROM Student s WHERE s.id=:id");
query.setParameter("id",studentIt)

有关确切的 API 详细信息,请查看文档@http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html

您也可以使用CriteraApi - 这是为动态查询创建而设计的。

【讨论】:

  • 感谢您的回复,但正如我所提到的,我可能会将 studentId 设为 null,上面的代码可以工作吗?当输入 studentId 为 null 时,它不会将学生 id 与 null 进行比较吗?
  • 如果你可以有空的 PK 而不是什么是不对的......无论如何,你总是可以尝试WHERE s.id=:id OR id IS NULL。但是不,空值在这种情况下不起作用,必须修改 where 子句 - 使用 CriteriaAPI 构建此类条件查询。
  • 我将在数据库中完美地保存数据。我的问题是我可能会在输入参数中将 studentID 设为 null,例如 hentStudentInfo(int studentID, firstname..) 。因此我的输入参数可能为空,也可能不为空。如果输入参数为空,则查询将形成为 SELECT s FROM Student s WHERE s.id=null 我希望如果参数为空,则不应使用该参数,因此查询将是 SELECT s FROM Student s;或者有什么办法可以处理 SQL 吗?
  • 我的问题是,如果 id=null,查询是否应该返回任何结果。 Idk 你的数据模型。无论如何,您得到了解决方案 - 条件 WHERE s.id=:id 或 IS NULL,或使用标准 API,或自己连接字符串
  • :) 如果参数为空,我应该得到结果 :) 我不想通过连接字符串来处理它,它看起来很难看。我正在寻找一种更好的方法,我不想通过添加条件 WHERE s.id=:id 或 IS NULL 来处理它。我厌倦了寻找更好的方法,但找不到任何方法:(
【解决方案2】:

您可以通过使用可选参数动态构建 HQL 来做到这一点,如下所示:

Map<String, Object> parameters= new HashMap<String,Object>();
parameters.put("firstName", firstName);
parameters.put("lastName", lastName);


StringBuilder hql = "SELECT student FROM Student as student where 1 = 1";
if (firstName != null) {
  hql.append(" and student.firstName in :firstName");
}
if (lastName != null) {
  hql.append(" and student.lastName in :lastName ");
}


Query query = session.createQuery(hql.toString());


for (String p : query.getNamedParameters()) {
  query.setParameter(p, parameters.get(p));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多