Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将结果限制为带有JPA2注释的活动记录_Java_Jpa - Fatal编程技术网

Java 如何将结果限制为带有JPA2注释的活动记录

Java 如何将结果限制为带有JPA2注释的活动记录,java,jpa,Java,Jpa,我当前的应用程序是一个EJB2.x系统,在任何地方都使用实体bean,带有CMR和CMP。我正在寻找用标准JPA替换持久层,但我无法确定以下是否可行 当请求删除记录时,系统通过在表VOID_IND='y'上设置一列来实现逻辑删除。系统中的当前处理逻辑将使用CMR从子表中检索所有项,然后使用VOID\u IND='y'循环并丢弃这些项,并且仅返回到客户机VOID\u IND='n' 这对我来说似乎效率很低,我宁愿一开始就不返回这些“已删除”的记录。不幸的是,我只能找到特定于实现的注释来帮助解决这个

我当前的应用程序是一个EJB2.x系统,在任何地方都使用实体bean,带有CMR和CMP。我正在寻找用标准JPA替换持久层,但我无法确定以下是否可行

当请求删除记录时,系统通过在表VOID_IND='y'上设置一列来实现逻辑删除。系统中的当前处理逻辑将使用CMR从子表中检索所有项,然后使用
VOID\u IND='y'
循环并丢弃这些项,并且仅返回到客户机
VOID\u IND='n'

这对我来说似乎效率很低,我宁愿一开始就不返回这些“已删除”的记录。不幸的是,我只能找到特定于实现的注释来帮助解决这个问题

休眠为@Where和eclipseelink@AdditionalCriteria


但是我想知道是否有专门用于JPA的标准注释?

没有,不幸的是没有标准过滤器

我认为您应该创建一个查询

JPA包括JPQL和Criteria API,但我强烈建议使用类型安全自动生成的“查询”类,看看哪一个是真正好用的

下面是QueryDSL中的一个示例;没有那么多代码

  • 父对象是父对象
  • qChild有点像QueryDSL魔术。它是一个静态导入到自动生成的子查询类中的字段。事实上,这真的很好

Query q=newquery();
列表活动=q.from(qChild)
其中(qChild.parent.eq(parent),qChild.voidInd.eq('Y'))
.名单(qChild);
或者

q.from(qChild);
q.where(qChild.parent.eq(parent));
q.where(qChild.voidInd.eq('Y'));
List<Child> active = q.list(qChild);
q.from(qChild);
q、 式中(qChild.parent.eq(parent));
q、 式中(qChild.voidInd.eq('Y'));
列表激活=q.List(qChild);

非常感谢您的回答!我不妨提到QueryDSL背后的主要开发人员似乎很有帮助,而且在Stackoverflow方面也相当活跃。嗨Timo顺便说一句,谢谢你修改我的答案。
q.from(qChild);
q.where(qChild.parent.eq(parent));
q.where(qChild.voidInd.eq('Y'));
List<Child> active = q.list(qChild);