我有一个数据库表,用于存储网址(例如 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?
答案 0 :(得分:2)
不,您无法在Criteria查询中调用持久值的方法。 JPQL也有同样的限制。最后,这两个转换为SQL查询和任意Java对象中的调用方法都不太合适。
同样在你的情况下,我们尝试通过字段或方法访问它并不重要。原因是java.net.URL中的字段与实体中映射的持久属性不同。 URL字段不是直接持久化的(因此您无法在SQL中查询它们),Serializable对象只是通过序列化持久化到字节数组或类似的。
此外,在java.net.URL中调用equals会导致意外:java.net.url Javadoc
只需使用字符串作为类型,并注意数据库中的字段也足够长,以及令人惊讶的长网址。