前提:
我最近被分配使用Java + JPA + Hibernate应用程序。
此应用程序具有4个不同的“模块”,每个模块都是彼此的“复制+粘贴”,只是做了些微改动。
我想删除所有重复项并使用一个数据库模式(当前,每个“模块”都有一个模式)。
我正在尝试以最少的“侵入性”方式开始,而不是对现有内容进行太多更改。
我所做的是:
示例:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "SYSTEM", length = 10, discriminatorType = DiscriminatorType.STRING)
@Table(name = "GROUP")
public abstract class Group<U extends UserGroup> {
@Id
private Integer id;
@Column(name = "CODE")
private String code;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "group")
private List<U> users;
@Entity
@Table(name = "USER_GROUP")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "SYSTEM", length = 10, discriminatorType = DiscriminatorType.STRING)
public abstract class UserGroup<G extends Group> {
@Id
private Integer id;
@Column(name = "name")
private String name;
@ManyToOne(optional=false)
@JoinColumn(name = "GROUP_ID", referencedColumnName = "ID", insertable=false, updatable=false)
private G group;
这些实现只定义了一个鉴别符列。
问题:
以下查询:
public interface UserGroupRepository<T extends UserGroup> extends CrudRepository<T, Integer> {
@Query(value = "select grp.code from #{#entityName} ug join ug.group grp where ug.name= ?1")
Iterable<String> listGroupByUser(String name);
由于我的用户对数据库中的每个模块都有一条记录(它应该仅返回1条),因此返回4条。
问题:
使用“ @Query”,我可以以某种方式正确地按区分值过滤吗?
答案 0 :(得分:0)
根据休眠Inheritance doc,您可以通过table per subclass
而不是table per class hierarchy
策略来实现。
答案 1 :(得分:0)
是的,您可以尝试使用where子句。有一个特殊的类属性,可用于将查询限制为子类型。以下是休眠参考文档。
根据您的情况,您可以使用subEntity名称而不是DomesticCat。
Click在这里查看where子句的休眠文档。