【问题标题】:create object in hibernate select在休眠选择中创建对象
【发布时间】:2010-12-02 12:28:22
【问题描述】:

我有 2 节课:

class A {
B b;

public A() {}
public A(B b) { setB(b); }
...
}

class B {
int id;
public B(int id) { setId(id); }
}

在 hql 我想这样选择:

select new A( new B(a.b.id) ) from A a

但我得到了错误

org.hibernate.hql.PARSER - 第 1:48 行:意外令牌:,

是否可以在参数中创建对象,或者只选择字段并在构造函数中创建它?

【问题讨论】:

  • 你到底想要什么?为什么这里要使用new,就不能直接使用SELECT a ...吗?
  • 这个类的字段比较多,我不想选择。
  • witch "select new A(a.b.id) from A a" hibernate 将只为该字段生成选择,而不为其他急切的字段生成选择。我想要的是获取对象而不是 int 值。但是在 B 中也有一些我不需要的热切领域,因此我不想获得完整的 B 对象。

标签: java hibernate hql


【解决方案1】:

不确定我是否完全理解您想要实现的目标。但是您可以创建一个 HQL 查询(带投影)以仅查询您感兴趣的列,例如:

select a.whatever, b.id from A a join a.b b

然后,您为接口ResultTransformer 提供一个实现,并将其设置为您的query 对象query.setResultTransformer(yourTransformer)

结果转换器的实现负责为AB 创建实例

【讨论】:

  • 此查询只返回任何内容和 id 的列表。我需要对象 A 列表,但如果 A 很大并且与其他对象有很大关系,则选择此 A 可能需要一些时间。有时我只需要 A 列表,其中只有几个相关对象中的几个字段。我可以用“select new A(a.whatever, a.b) from A”来做到这一点,但它会选择完整的 B 对象,我只需要它的 id,因此最好的查询是“select new A(a.whatever ,来自 A 的新 B(a.b.id)”,但休眠不允许这样做。因此我需要创建仅包含我需要的字段的其他类。
【解决方案2】:

也许考虑编写自己的函数来构建查询并使用 StrinBuilder 类 - 使用 hql.append 而不是写出查询!!!

导入 org.hibernate.Hibernate; 导入 org.hibernate.search.FullTextQuery; 导入 org.hibernate.search.FullTextSession; 导入 org.hibernate.search.Search;

不确定它是否有帮助,否则去看看 cyclos web 应用程序 - 它包含许多查询和相应的 java 文件。其开源并使用全面的hibernate

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 2017-06-05
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多