我一直在尝试 HQL 和 Criteria的 不同组合,但我无法避免某些不必要的 联接 (在这两者中)和某些不必要的 选择
(在Criteria中)。
在我们的场景中, 段* 和 应用程序 实体之间具有 @ManyToMany 关系(导航是从段到应用程序)。 ***
首先,我尝试了以下 条件 :
Application app = ...
List<Segment> segments = session.createCriteria(Segment.class)
.createCriteria(Segment.APPLICATIONS)
.add(Restrictions.idEq(app.getId()))
.list();
威奇产生这个SQL:
select
this_.id as id1_1_,
this_.description as descript2_1_1_,
this_.name as name1_1_,
applicatio3_.segment_id as segment1_1_,
applicatio1_.id as app2_, <==== unnecessary APPLICATIONS columns
applicatio1_.id as id7_0_,
applicatio1_.name as name7_0_,
applicatio1_.accountId as accountId7_0_,
applicatio1_.applicationFlags as applicat5_7_0_,
applicatio1_.description_ as descript6_7_0_,
from
SEGMENTS this_
inner join
SEGMENTS_APPLICATIONS applicatio3_
on this_.id=applicatio3_.segment_id
inner join <==== unnecessary join
APPLICATIONS applicatio1_
on applicatio3_.app_id=applicatio1_.id
where
applicatio1_.id = ?
如您所见, Criteria从APPLICATIONS选择列 ,我不想选择它们。我还没有找到一种方法(有可能吗?)。另外,它
与APPLICATIONS联接 ,我认为这不是必需的,因为 联接
表SEGMENTS_APPLICATIONS中已经存在应用程序ID(与HQL相同)。
(另一个疑问是,我想知道一个直接使用应用程序而不是app.getId()的限制。您将看到,我可以在查询的HQL版本中做到这一点)
由于我无法限制选择部分(不需要应用程序属性),因此我尝试使用“ select”子句来尝试此 HQL :
Application app = ...
List<Segment> segments = session.createQuery(
"select s from Segment s join s.applications as app where app = :app")
.setParameter("app", app)
.list();
产生:
select
segment0_.id as id1_,
segment0_.description as descript2_1_,
segment0_.name as name1_,
from
SEGMENTS segment0_
inner join
SEGMENTS_APPLICATIONS applicatio1_
on segment0_.id=applicatio1_.segment_id
inner join <==== unnecessary join
APPLICATIONS applicatio2_
on applicatio1_.app_id=applicatio2_.id
where
applicatio2_.id=?
您可以看到 HQL不会从Application中选择属性 (由于使用了“ select s”部分),但 仍会加入APPLICATIONS
表,我认为这是不必要的。我们如何避免这种情况?
(作为附带说明,请注意,在HQL中,我可以直接使用app,而不是像Criteria中那样使用app.getId())
您能帮我找到一种方法来避免标准中的“选择”和标准和HQL中不必要的“联接”吗?
(此示例与@ManyToMany一起使用,但我认为@OneToMany以及@ManyToOne和@OneToOne也会发生,即使使用fetch =
LAZY也是如此)。
非常感谢,费兰
使用Criteria时,其他选定的列来自Hibernate中的一个长期存在的错误。AFAIK唯一避免这种情况的方法是使用HQL或JPA2标准API。
另一个问题也表示为bug,但影响较小,我对此不太在意。
我一直在尝试HQL和Criteria的不同组合,但我无法避免一些不必要的连接(在两者中)和一些不必要选择(在Criteria中)。 在我们的场景中,我们在Segment和Application实体之间有@ManyTo的关系(导航是从Segment到应用程序)。 首先我尝试了这个标准: Wich 生成此 SQL: 正如您所看到的,Criteria从APPLICATION中选择列,我不想被选择。我还没
本文向大家介绍在React中如何避免不必要的render?相关面试题,主要包含被问及在React中如何避免不必要的render?时的应答技巧和注意事项,需要的朋友参考一下 shouldComponentUpdate、memoization、PureComponent
问题内容: 我有一个GUI,可根据滑块值向Web服务器发布命令。其中一些滑块是“耦合”在Web服务器上的,因此更改其中一个也可能会更改另一个。通过Web服务器返回基于发出的命令设置的值的列表来完成耦合。 因此,我可以根据此响应轻松设置适当的滑块,但问题是这样做会导致ChangeListener被触发,然后再次向Web服务器发出命令。理想情况下,“耦合”应表现良好,并避免无限循环,但这是一个潜在问题
问题内容: 我有几个较旧的应用程序,它们在E_NOTICE错误级别上运行时会抛出很多“ xyz未定义”和“未定义偏移”消息,因为没有使用和明确检查变量的存在。 我正在考虑通过它们使它们与E_NOTICE兼容,因为有关丢失变量或偏移量的通知可能会节省生命,可能会获得一些较小的性能改进,并且总体而言,这是一种更清洁的方法。 但是,我不喜欢什么造成数百 和S ^确实给我的代码。它变得肿,可读性降低,而没
我有一个Java servlet,它从android应用程序中获取一些数据,并使用以下代码将字符串数据返回给android应用程序。 然后使用以下方法将该值转换为字符串: 但是这样做之后,结果会添加一些不需要的字符(它们在菱形中以“?”的形式出现)附加到我从servlet传递的原始字符串中。我怎样才能避免这个?
我正在编写一些Swing应用程序,用于使用MigLayout进行测量。我试图消除不必要的差距。 我已经注意到,由于顶部的句子,差距是存在的。然而,当我删除它时,它看起来很好。 该问题在下图中可见: 我加句子的方式是: 我添加按钮的方式: 有人能帮我解释一下为什么会发生这种情况,以及我如何消除与现在句子的差距吗? ////////////编辑 我想使用我当前的基础架构,我已经在miglaway中启用