@ManyToOne字段的Hibernate @Filter实体

时间:2016-10-12 13:32:02

标签: java hibernate filter field many-to-one

我试图在多对一关系字段中使用Java的Hibernate @Filter,但是当我启用过滤器并尝试使用来自AJAX的StockDailyRecord服务调用getAll方法时,我得到了这个:

HTTP Status 500 - Request processing failed; 
nested exception is javax.persistence.PersistenceException:
org.hibernate.exception.SQLGrammarException: could not extract ResultSet

这是我定义过滤器的实体:

@Entity
@Table(name = "stock_daily_record", catalog = "mkyong")
@FilterDef(name="stockDailyRecordFilter")
@Filters({
    @Filter(name="stockDailyRecordFilter", condition="stock.name = 'My stock'"),
})
public class StockDailyRecord extends Entity implements Serializable {
         ...
    @ManyToOne
    @JoinColumn(name = "stock_id", referencedColumnName = "id", nullable = false )
    public Stock getStock() {
        return this.stock;
    }
}

但是,当我使用数据库中的实际列更改过滤器" stock_id"并将其与我希望过滤器工作的ID进行比较,没有任何例外。

@Filter(name="stockDailyRecordFilter", condition="stock_id = 10")

以下是我在StockDailyRecordService中启用过滤器的方法:

    Session hSession = getSession();
    if (isAnonymous) {
        hSession.enableFilter("stockDailyRecordFilter");
    } else {
        hSession.disableFilter("stockDailyRecordFilter");
    }

另外,当我在其他属性上尝试过滤时(比如说StockDailyRecord有字段"描述")它运行得很好。有没有办法访问"名称"过滤条件中Stock实体的属性,因为我不想真的想用" stock_id = 10"

1 个答案:

答案 0 :(得分:2)

尝试从过滤器定义中删除stock

@Filter(name="stockDailyRecordFilter", condition="name = 'My stock'")

UPDATE 所以这里的股票是相关表而不是主表。您可以尝试使用IN

加入subselect
condition="stock_id in (select id from stock where name = 'My stock')"