如何解决使用SELECT时JPA的奇怪行为
我是Java新手,请尝试使用生成的JPA控制器为图书馆开发SWing应用。
当我尝试从sql server数据库中选择结果时,我使用此命令
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<BookTitles> cq = criteriaBuilder.createQuery(BookTitles.class);
cq.select(cq.from(BookTitles.class)).where(criteriaBuilder.isNull(cq.from(BookTitles.class).get("status")));
但是,此命令返回db中9行的记录。例如,如果db有10行,它将重复这10行约9次,并返回包含90个元素的列表。
我改为此代码,而不是
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<BookTitles> cq = criteriaBuilder.createQuery(BookTitles.class);
Root<BookTitles> root = cq.from(BookTitles.class);
cq.select(root).where(criteriaBuilder.isNull(root.get("status")));
,结果将与db中列出的相同。
这两个代码之间唯一的不同是,我传递了cq.from(...)
的结果,而不是直接将select()
传递给cq.from(...)
。
我个人认为这两种编码方式之间没有任何区别,但是结果告诉了另一种方式。
有人可以花时间解释吗?
解决方法
这不是奇怪的行为
通过两次使用CriteriaBuilder方法,您将在该子句中设置两个表以了解笛卡尔乘积的作用。
您可以在文档中看到
“创建并添加与给定实体相对应的查询根,以形成具有任何现有根的笛卡尔乘积。”
因此,正确的方法是第二种方法,即将构成from子句的表存储在变量中,并使用此方法,而不是通过criteriasquery from方法将更多表添加到from子句中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。