【问题标题】:HQL query join tablesHQL 查询连接表
【发布时间】:2012-11-06 17:08:45
【问题描述】:

我正在使用 hibernate 连接到我的数据库以进行项目。

我想要一个查询,以某种语言从我的数据库中取出产品的描述和名称。我的参数是语言的简称,所以首先我必须获取语言的 id,然后获取所需语言的文本。

我尝试了以下 hql 查询,但没有成功。

from Products as p
where p.productlanguages.languages.shortname like 'eng'

这是数据应该来自的数据库部分的图像:

我通过 sql 查询得到了想要的结果,但我似乎无法让它在 hibernate 中工作。但我更愿意在 hql 中执行此操作。

SELECT * FROM products p 
INNER JOIN productlanguage pl ON pl.Products_id = p.id 
WHERE pl.Languages_id = 
(
SELECT id FROM languages 
WHERE Shortname = 'eng'
);

谁能告诉我如何构建这个 hql 查询? 谢谢。

【问题讨论】:

    标签: java hql


    【解决方案1】:

    试试下面:

       from Products p INNER JOIN p.productlanguages pl
       where pl.languages.shortname ='eng'
    

    我假设您已将 Product-Productlanguages 关系映射为 OneToManyProductlanguages-Langages 关系映射为 ManyToOne,如 E-R 图中所示。

    编辑:Productlanguage 映射中的public Languages getLanguages() {barcode 行似乎有错字,最后删除barcode

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="Languages_id", nullable=false, insertable=false, updatable=false)
    public Languages getLanguages() {barcode
    
        return this.languages;
    }
    

    【讨论】:

    • 这可行,但现在我不能将结果放入 Set
    • @Jerodev:这应该返回带有唯一产品实体的List<Product>
    • 这是我的模型的代码:http://pastebin.com/8aM5eKYx。每当我尝试您提供的查询时,我都会收到一条错误消息“无法找到带有 [0] 参数的方法 [getBarcode]”。
    • @Jerodev:您是否按原样使用上述查询?我在查询中没有看到任何条形码。在您的映射中,您已将 barcode 映射为字符串,因此应该没有任何问题。分享您的查询。同时分享Productlanguage映射。
    • 查询以某种方式创建了另一个不是“产品”的对象。这是产品语言的映射:http://pastebin.com/t981xjLH
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多