gpt4 book ai didi

java - 使用 URL 键/值样式参数的 Hibernate 查询限制

转载 作者:行者123 更新时间:2023-11-29 08:04:05 24 4
gpt4 key购买 nike

我正在使用 Tapestry5 和 Hibernate。我正在尝试构建使用从 URL 生成的动态限制的条件查询。我的 URL 上下文被设计成键/值对。

例子

www.mywebsite.com/make/ford/model/focus/year/2009

我解码参数如下

private Map<String, String> queryParameters;
private List<Vehicle> vehicles;

void onActivate(EventContext context) {
//Count is 6 - make/ford/model/focus/year/2009
int count = context.getCount();

if (count > 0) {
int i;
for (i = 0; (i + 1) < count; i += 2) {
String name = context.get(String.class, i);
String value = context.get(String.class, i + 1);

example "make"
System.out.println("name " + name);

example "ford"
System.out.println("value " + value);

this.queryParameters.put(name, value);
}
}

this.vehicles = this.session.createCriteria(Vehicle.class)
...add dynamic restrictions.
}

我希望有人能帮我弄清楚如何将限制列表动态添加到我的查询中。我确定这已经完成,所以如果有人知道帖子,那也会有帮助。谢谢

最佳答案

正如其他答案所说,但这里更详细。我认为您问题的症结在于“告诉我如何添加限制”。无论如何,这是我的解释。

您需要将每个限制解码到它自己的字段中。

您需要知道每个字段的 Java 实体属性名称。

然后构建这两个东西的 Map,键是已知的静态 Java 实体属性名称,值是 URL 解码数据(可能带有类型转换)。

private Map<String, Object> queryParameters;
private List<Vehicle> vehicles;

void onActivate(EventContext context) {
//Count is 6 - make/ford/model/focus/year/2009
int count = context.getCount();

queryParameters = new HashMap<String,Object>();
if (count > 0) {
int i;
for (i = 0; (i + 1) < count; i += 2) {
String name = context.get(String.class, i);
String value = context.get(String.class, i + 1);

Object sqlValue = value;
if("foobar".equals(name)) {
// sometime you don't want a String type for SQL compasition
// so convert it
sqlValue = UtilityClass.doTypeConversionForFoobar(value);
} else if("search".equals(name) ||
"model".equals(name) ||
"year".equals(name)) {
// no-op this is valid 'name'
} else if("make".equals(name)) {
// this is a suggestion depends on your project conf
name = "vehicleMake.name";
} else {
continue; // ignore values we did not expect
}
// FIXME: You should validate all 'name' values
// to be valid and/or convert to Java property names here

System.out.println("name " + name);
System.out.println("value " + value);

this.queryParameters.put(name, sqlValue);
}
}

Criteria crit = this.session.createCriteria(Vehicle.class)
for(Map.Entry<String,Object> e : this.queryParameters.entrySet()) {
String n = e.getKey();
Object v = e.getValue();
// Sometimes you don't want a direct compare 'Restructions.eq()'
if("search".equals(n))
crit.add(Restrictions.like(n, "%" + v + "%"));
else // Most of the time you do
crit.add(Restrictions.eq(n, v));
}

this.vehicles = crit.list(); // run query
}

另见 https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/querycriteria.html

有了上面的内容,应该没有 SQL 注入(inject)的风险,因为“名称”和“n”部分应该根据已知的良好列表进行 100% 验证。 “value”和“v”被正确转义,就像使用 SQL 位置占位符“?”一样。

环境与环境

关于java - 使用 URL 键/值样式参数的 Hibernate 查询限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12557613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com