我正在尝试解决与冬眠过滤有关的问题,特别是在处理复合ID的
时我有一个attrdesc.hbm.xml
<hibernate-mapping>
<class name="AttrDesc" table="ATTRDESC">
<composite-id>
<key-property name="attr_id" type="long"/>
<key-property name="language_id"/>
</composite-id>
<property name="attrtype_id"/>
<property name="name"/>
<property name="description"/>
<property name="description2"/>
<property name="field1"/>
<property name="groupname"/>
<property name="qtyunit_id"/>
<property name="noteinfo"/>
<filter name="langFilter" condition=":langid=language_id"/>
</class>
<filter-def name="langFilter"> <filter-param name="langid" type="int"/> </filter-def>
</hibernate-mapping>
问题:我无法在Composite-ID的一部分
上应用过滤器在调试时,我发现filter -param langid是一个值为0的方式,其中我使用以下代码行设置的实际值为-1
session.enableFilter("langFilter").setParameter("langid", -1);
注意:如果我将Lagansy_id移出复合ID
,那有效任何帮助将不胜感激,谢谢
对于Hibernate JPA 2.1及更高版本,您应该对映射进行一些修改。
<composite-id name="attrDescId" class="AttrDescId">
<key-property name="attr_id" type="long"/>
<key-property name="language_id"/>
</composite-id>
因此,您需要将模型类更改为
public class AttrDesc {
AttrDescId id;
String name;
//other fields
}
public class AttrDescId {
long attr_id;
String language_id;
}
然后使用root.get("attrDescId").get("language_id")
,您将能够将过滤器放在language_id
上。精心策划,
CriteriaBuilder builder = sessionFactory.getCriteriaBuilder();
CriteriaQuery<AttrDesc> query = builder.createQuery(AttrDesc.class);
Root<AttrDesc> root = query.from(AttrDesc.class);
query.select(root).where(builder.equal(root.get("attrDescId").get("language_id"), "the filter value"));
Query<AttrDesc> q = sessionFactory.getCurrentSession().createQuery(query);
List<AttrDesc> attrDescList = q.getResultList();