【问题标题】:Java Hibernate HQL SQL INNER JOIN query not working- OracleJava Hibernate HQL SQL INNER JOIN 查询不起作用 - Oracle
【发布时间】:2014-10-19 04:42:43
【问题描述】:

Hibernate / Java 新手在这里,任何帮助将不胜感激!

所以......我有一个名为 ITEMS 的表和一个由

连接的 ITEM_OWNER_JOIN 表

“itemKey”列和“owners”列,它是一组字符串值...

在 Item.java 我有:

@ForeignKey(name="FK_ITEM_OWNER_FK")
@ElementCollection(targetClass=java.lang.String.class, fetch = FetchType.Eager)
@JoinTable(name= "ITEM_OWNER_JOIN", joinColumns=@JoinColumn(name="itemKey"))
private Set<String> owners = new HashSet<String>();

基本上我正在尝试运行 HQL 查询所有者匹配的结果 searchText 参数....

所以我试过了:

Query q = session.createQuery("select distinct i.itemKey from Item i inner join"+  
          " i.owners o where o.owners like '"+searchText+"'");

我得到一个 org.hibernate.QueryException: cannot dereference scalar collection element: owner [select distinct w.workspaceKey from.....]

我已尝试研究该异常但无济于事... :(

感谢您的宝贵时间!

【问题讨论】:

    标签: java sql hibernate hql


    【解决方案1】:

    如下所示

    HQL

    select i 
    from Item i 
    inner join i.owners io 
    where io like 'searchText';
    

    Oracle 查询

    SELECT Distinct(i.itemKey) 
    FROM Item i, ITEM_OWNER_JOIN io 
    WHERE i.itemKey  = io.itemKey and io.x like '%%';
    

    其中“x”是列名。

    我的应用程序中的工作示例

    来自实体:

     @ElementCollection
        @JoinTable(name = "rule_tagged_name", joinColumns = @JoinColumn(name = "re_rule", referencedColumnName = "id"))
        private List<String>         ruleTagNames;
    

    数据库列

    RE_RULE NUMBER
    RULE_TAG_NAMES
    

    HQL

    Select ru FROM Rule ru inner join ru.ruleTagNames rt_name WHERE rt_name in :tagNameList
    

    【讨论】:

    • 谢谢!在 like 修复错误之前将 io.owners 更改为 io,你们知道它为什么会抛出该错误吗?我在 ITEM_OWNER_JOIN 表中有一个名为“owners”的列,因为该列没有显式注释。也许是因为字符串集合“owners”和连接表的列“owners”命名相同而感到困惑?
    【解决方案2】:

    尝试使用 IN 运算符,因为 owners 是多个。

    Query hqlQuery = session.createQuery("select distinct i.itemKey from Item i inner join"+  
          " i.owners o where o.owners in :ownersParam");
    

    然后用所有者设置的值设置参数owners

    Set<String> ownerSet = new HashSet<String>();
    ownerSet.add(searchText);
    
    hqlQuery.setParameterList("ownersParam", ownerSet);
    
    //then retrieve result
    

    【讨论】:

      猜你喜欢
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 2012-11-04
      相关资源
      最近更新 更多