- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我将 Hibernate 4.1.3.Final 与 JPA 2.1 和 MySQL 5.5.37 一起使用。我有一个具有以下字段的实体:
@Entity
@Table(name = "category",
uniqueConstraints = { @UniqueConstraint(columnNames = { "NAME" })}
)
public class Category implements Serializable, Comparable<Category> {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
@GeneratedValue(generator = "uuid-strategy")
private String id;
@NotEmpty
private Set<Subject> subjects;
...
}
subjects
字段没有简单的连接表,取而代之的是稍微复杂一点的 MySQL 查询。以下是根据特定类别 ID 计算主题的示例:
SELECT DISTINCT e.subject_id
FROM category c, resource_category rc, product_resource pr,
sb_product p, product_book pe, book e
WHERE c.id = rc.category_id
AND rc.resource_id = pr.resource_id
AND pr.product_id = p.id
AND p.id = pe.product_id
AND pe.ebook_id = e.id
AND c.id = ‘ABCEEFGH‘;
加载类别时,使用下面的查询连接上述字段的最简单方法是什么?
这个问题涉及处理 Java 以完成此操作,因此构建 View 或执行其他类型的 MySQL 疯狂操作不是一种选择,至少作为这个问题的答案是这样。
编辑:
根据建议添加了符号(将“=id”替换为“=id”),但是当我查询与类别实体相关的项目时,Hibernate 生成了这个无效的 SQL。这是 SQL Hibernate 吐出的
SELECT categories0_.resource_id AS RESOURCE1_75_0_,
categories0_.category_id AS CATEGORY2_76_0_,
category1_.id AS ID1_29_1_,
category1_.NAME AS name2_29_1_,SELECT DISTINCT e.subject_id
FROM category c,
resource_category rc,
product_resource pr,
product p,
product_ebook pe,
book e
WHERE c.id = rc.category_id
AND rc.resource_id = pr.resource_id
AND pr.product_id = p.id
AND p.id = pe.product_id
AND pe.ebook_id = e.id
AND c.id = category1_.id as formula1_1_,
subject2_.id AS id1_102_2_,
subject2_.NAME AS name2_102_2_
FROM resource_category categories0_
INNER JOIN category category1_
ON categories0_.category_id=category1_.id
LEFT OUTER JOIN subject subject2_
ONSELECT DISTINCT e.subject_id
FROM category c,
resource_category rc,
product_resource pr,
product p,
product_ebook pe,
book e
WHERE c.id = rc.category_id
AND rc.resource_id = pr.resource_id
AND pr.product_id = p.id
AND p.id = pe.product_id
AND pe.ebook_id = e.id
AND c.id = category1_.id=subject2_.id
where categories0_.resource_id=?
注意最后的“left outer join subject subject2_ on SELECT DISTINCT e.subject_id”和“AND c.id = category1_.id=subject2_.id”。
编辑 2:
这里是上面查询涉及的实体
@Entity
@Table(name="resource")
public class Resource implements Serializable, Comparable<Resource>
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "uuid-strategy")
private String id;
…
@Column(name = "FILE_NAME")
private String fileName;
@Column(name = "URI")
private String uri;
…
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "resource_category", joinColumns = { @JoinColumn(name = "RESOURCE_ID") }, inverseJoinColumns = { @JoinColumn(name = "CATEGORY_ID") })
private Set<Category> categories;
这是查询本身......
CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
CriteriaQuery<T> criteria = builder.createQuery(Resource.class);
Root<T> rootCriteria = criteria.from(Resource.class);
criteria.select(rootCriteria).where(builder.equal(rootCriteria.get(“uri”),uri));
Resource ret = null;
try {
final TypedQuery<T> typedQuery = m_entityManager.createQuery(criteria);
ret = typedQuery.getSingleResult();
} catch (NoResultException e) {
LOG.warn(e.getMessage());
}
return ret;
最佳答案
您需要使用特定于 Hibernate 的 JoinColumnOrFormula :
public class Category implements Serializable, Comparable<Category> {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
@GeneratedValue(generator = "uuid-strategy")
private String id;
@NotEmpty
@ManyToOne
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(
formula = @JoinFormula(
value =
"SELECT DISTINCT e.subject_id " +
"FROM category c, resource_category rc, product_resource pr, " +
" sb_product p, product_book pe, book e " +
"WHERE c.id = rc.category_id " +
" AND rc.resource_id = pr.resource_id " +
" AND pr.product_id = p.id " +
" AND p.id = pe.product_id " +
" AND pe.ebook_id = e.id " +
" AND c.id = ‘ABCEEFGH‘",
referencedColumnName="id"
)
)
})
private Set<Subject> subjects;
...
}
或者,您可以将此查询包含在存储过程中:
CREATE FUNCTION join_book(text) RETURNS text
AS 'SELECT DISTINCT e.subject_id ' +
'FROM category c, resource_category rc, product_resource pr, ' +
' sb_product p, product_book pe, book e ' +
'WHERE c.id = rc.category_id ' +
' AND rc.resource_id = pr.resource_id ' +
' AND pr.product_id = p.id ' +
' AND p.id = pe.product_id ' +
' AND pe.ebook_id = e.id ' +
' AND c.id = $1;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
然后,您的映射变为:
public class Category implements Serializable, Comparable<Category> {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
@GeneratedValue(generator = "uuid-strategy")
private String id;
@NotEmpty
@ManyToOne
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(
formula = @JoinFormula(
value = "join_book(id)",
referencedColumnName="id"
)
)
})
private Set<Subject> subjects;
...
}
关于java - 如何使用查询而不是带有 JPA 的 @JoinColumn 映射实体关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29566572/
这是简化的代码片段,省略了 IdClass 详细信息。我遇到的问题是表定义是: ClientPersonalityModel ( client_id int not null, personali
我正在编写一个 spring-boot、spring-mvc 应用程序。其中有两个实体:User 和 Task。该任务必须属于用户。我正在尝试使用外键、使用 @OneToMany、@ManyToOne
有关更多上下文,请参阅 my other question。 我想将我的 Employee 实体类加入到 Code 实体类中,但代码 PK 是复合的(DOMAIN、CODE),因为它列出了许多不同的代
我正在尝试使用 @JoinColumn 注释加入一个列,但我的列总是返回 null,我不确定为什么。 @Entity public class Blender implements Serializa
我有实体 User,其中包含实体 Actor 的字段,其中包含具有实体产品的字段。现在我希望数据库中的用户拥有有关产品 id 的信息,该信息使用产品上的 @JoinColum 存储在 Actor 中。
我使用 @JoinColumn 注释进行一对多映射: @JoinColumn(name="domainId",referencedColumnName="domainId")。 但是,表中的外键列名称
@ManyToOne @JoinColumn(name = "someValue" , referencedColumnName = "someOtherValue" ) 如果 2 个表通过 Many
我在尝试为数据库创建一些模型时遇到 JPA 问题。 我有这三个类(我只是将部分代码放在这里): GuideVersionLang @Entity public class GuideVersionLa
我可能只是误解了@JoinColumns 的工作原理,但是当我重用名称属性时出现错误。但是名称属性不映射到数据库列吗?我不应该能够重复使用它吗? 我遇到错误: Repeated column in m
根据 hibernate 文档, hibernate 团队强烈建议不要在没有连接表的情况下使用一对多单向映射。我想知道这是因为性能问题还是背后有任何其他原因。 说如果有一个员工可以有很多电话号码,那么
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn (name = "account_id") private Account account; 工作正常。
我是 HQL 的初学者,并且我陷入了使用 HQL 检索 VesselOperator 记录的困境 我的代码如下所示。 CompanyId.java @Embeddable public class C
抱歉我的问题。实在无法理解我的错误。我在两个类之间有 Hibernate 关系,但是当我运行它时,日志给出了这个错误: org.hibernate.AnnotationException: mappe
我正在研究一个使用 JPA 的项目,我对此还很陌生。我遇到了一个我不太理解的逻辑。我有一个名为 A 的实体,它具有以下字段/列: @Column(name = "COD_UOP_COO") p
我正在将 JPA 与 EclipseLink (2.5.2) 结合使用。 我有以下实体: @Entity @Table(name="Consumer") public class Consumer i
我遇到以下问题:我想简单地加入表“市场”(主)和“电话”,但在使用注释执行此操作时遇到一些问题。 我只是想使用 Comercio.id 作为 Telefone.fk_id 中相应的外键,但它无法识别它
我有以下表格(仅显示最重要的列,A 和 B 不是真实姓名): table A { ... } table B { ... } table METADATA { KEY VALUE
在我的 JPA 类中,我有这个注释和我无法理解的语法 @JoinColumns({ @JoinColumn(name="RES_ID", referencedColumnName="ACCT_
有什么区别: @Entity public class Company { @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.L
我有很多映射实体,它们都是从抽象类 BaseEntityImpl 扩展而来的。 在这个类中,我有 1 个属性 company,注释如下: @ManyToOne(fetch=FetchType.EAGE
我是一名优秀的程序员,十分优秀!