我最近试图为我的一些hibernate映射实体引入接口,但无法弄清楚如何配置映射.
当我使用接口而没有任何进一步的声明时,我总是得到以下异常:
org.hibernate.MappingException: Could not determine type for: ...MyInterface
Run Code Online (Sandbox Code Playgroud)
然后当我明确定义targetEntity时,我发现一切正常:
@OneToOne(targetEntity=InterfaceImpl.class)
private MyInterface myInterface;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个解决方案在我的情况下不起作用:我无法通过注释定义targetEntity,因为我想将此类提取到一个不包含甚至不知道接口的最终实现的公共外部库.
那么是否有另一种方法来声明应该使用哪种实现,我可以在提取的库之外使用?
我有一个对象(BlogPost),它包含一个M:N元素集合(标签).
如何查询一个对象(BlogPost),其中至少有一个对象的标签与一组标签(由用户定义)中的元素与JPA2(Hibernate)匹配.
findBlogPostWithAtLeastOneMatchingTag(Collection<Tag> tags){ ???? }
Run Code Online (Sandbox Code Playgroud)
我的主要问题是,我实际上需要比较两个标签集合: - BlogPost的标签集合. - 我搜索的集合
我试过Select p from Post p where p.tags in(:tags)
但它不起作用,因为我的帖子实体不仅仅有一个标签.
那我该怎么做呢?
我的BlogPost实体看起来像这样.它有几个标签.
@Entity
public class BlogPost{
/** The tags. */
@ManyToMany()
@NotNull
private Set<Tag> tags;
@NotBlank
private String content;
...
}
Run Code Online (Sandbox Code Playgroud)
解决方案不能是JPQL,JPA-Criteria(不是Hibernate-Criteria)也可以.
我正在努力处理一个包含区域枚举值列表的公司实体.这些是公司正在进行的领域.它们被映射为@ElementCollection
.
@Entity
public class Company {
@ElementCollection
@CollectionTable(name = "company2area")
@Enumerated(EnumType.STRING)
private List<Area> areas = new ArrayList<Area>();
...
}
Run Code Online (Sandbox Code Playgroud)
区域是一个简单的枚举,包含可用区域.
public enum Area {
ASIA,
AMERICA,
EUROPE;
}
Run Code Online (Sandbox Code Playgroud)
我试图查询目前在ASIA和AMERICA工作的所有公司,如下所示:
CriteriaQuery<Company> query = this.entityManager.getCriteriaBuilder()
.createQuery(Company.class);
query.where(query.from(Company.class)
.get("areas")
.in(Arrays.asList(Area.ASIA, Area.AMERICA)));
List<Company> result = entityManager.createQuery(q)
.getResultList();
Run Code Online (Sandbox Code Playgroud)
但我得到的只是一个例外:
Caused by: java.lang.IllegalArgumentException: Parameter value [ASIA]
did not match expected type [java.util.Collection] at
org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:375)
at
org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:348)
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:375) at
org.hibernate.ejb.criteria.CriteriaQueryCompiler$1$1.bind(CriteriaQueryCompiler.java:195)
at
org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:241)
at
org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:587)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597) at …
Run Code Online (Sandbox Code Playgroud)