在java.net.URL类型对象上执行条件查询的可能性和限制

时间:2011-11-28 14:00:38

标签: java jpa-2.0 criteria-api

我有一个数据库表,用于存储网址(例如 http://google.com )。与该表对应的实体具有 URL 类型字段,因此我创建了一个条件查询,如下所示:

CriteriaBuilder cb = ...
Path<URL> path = ...
cb.equal(path , new URL("http://google.com"));

这是按预期工作的,但我希望能够做到这样的事情:

cb.like(path.<String>get("externalForm"), "%google%");

显然,URL没有 externalForm 字段,而是有一个 toExternalForm()方法。

这种查询是否可以通过API实现?如果是的话:怎么样?或者我最好将URL列映射到String而不是URL?

1 个答案:

答案 0 :(得分:2)

不,您无法在Criteria查询中调用持久值的方法。 JPQL也有同样的限制。最后,这两个转换为SQL查询和任意Java对象中的调用方法都不太合适。

同样在你的情况下,我们尝试通过字段或方法访问它并不重要。原因是java.net.URL中的字段与实体中映射的持久属性不同。 URL字段不是直接持久化的(因此您无法在SQL中查询它们),Serializable对象只是通过序列化持久化到字节数组或类似的。

此外,在java.net.URL中调用equals会导致意外:java.net.url Javadoc

只需使用字符串作为类型,并注意数据库中的字段也足够长,以及令人惊讶的长网址。