Tag: jpa

使用@ElementCollection映射Set

我有以下枚举: package ir.raysis.tcs.rule.days; public enum Days { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; } 我尝试将其映射为Set天,如下所示: @ElementCollection(targetClass = Days.class) @JoinTable(name = “days”,joinColumns = @JoinColumn(name = “rule_id”)) @Column(name =”daysOfWeek”, nullable = false) @Enumerated(EnumType.STRING) private Set days = new HashSet(); 但是,它会引发以下exception: Initial SessionFactory creation failed.org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: rule, for columns: [org.hibernate.mapping.Column(days)] […]

FetchMode连接对spring JPA存储库中的ManyToMany关系没有任何区别

我正在尝试这样做: //… class Person { @ManyToMany(fetch = FetchType.EAGER) @Fetch(FetchMode.JOIN) private Set groups; //… } 当我执行personRepository.findAll();时,它会生成n + 1个查询personRepository.findAll(); 通过Spring JPA存储库,就好像我没有设置任何@Fetch 。 (一个查询首先获取所有人,然后每个人查询一次以获取组)。 但是,使用@Fetch(FetchMode.SUBSELECT) 可以正常工作 ! 它只生成2个查询。 (一个适用于所有人,一个适用于团体)。 所以hibernate会对一些 fetch参数做出反应,而不是JOIN 。 我也尝试过没有运气取出EAGER 。 //… class Person { @ManyToMany() @Fetch(FetchMode.JOIN) private Set groups; //… } 我正在使用Spring JPA,这是我的存储库的代码: public interface PersonRepository extends JpaRepository { } JOIN是不是通过Spring JPA工作,还是我做错了什么?

如何使用hibernate / jpa注释将一个类映射到不同的表

我目前陷入了一个似乎非常简单的问题,但我似乎无法找到解决办法: 我有2个相同的表: tbl_creditcard_approved_txns tbl_creditcard_declined_txns 两者中的字段是相同的,我有一个类 – 用于表示表中所有适当字段的Transaction 。 我正在尝试将两个不同的实体(每个表一个)映射到上面的类。 在旧世界中,我已经创建了两个hbm.xml文件,每个表对应一个表并将它们映射到Transaction 。 然后,我将在持久性期间使用实体名称,以确保对象在正确的表中持久化,具体取决于具体情况。 我正在尝试使用当前的注释来实现相同的目标但到目前为止在将2个实体映射到单个类时没有运气。 这有可能吗? 我目前正在使用不同的方法,因为我已经将所有公共字段(相同的列名称)提取到@MappedSuperClass并且已经创建了两个单独的类(每个实体一个)从超类扩展(这些类只有具有不同列名的相同字段(如果适用)。

在JPQL中有这样的CASE表达吗?

假设有一张表: TableA:Field1, Field2, Field3 和相关的JPA实体类 @Entity @Table(name=”TableA”) public class TableA{ @Id @Column(name=”Field1″) private Long id; @Column(name=”Field2″) private Long field2; @Column(name=”Field3″) private Long field3; //… more associated getter and setter… } 有没有办法构造一个松散地翻译成这个SQL的JPQL语句,即如何将case表达式翻译成JPQL? select field1, case when field2 = 1 then ‘One’ when field2 = 2 then ‘Two’ else ‘Other number’ end, field3 from tableA;

JPA Native Query选择和转换对象

我有一个扩展User的对象Admin 。 默认情况下,两个对象都在我的Derby数据库的User_表中(来自Admin包含字段)。 通常我会像这样选择一个User : CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery(User.class); Root user= query.from(User.class); Predicate predicateId = cb.equal(category.get(“id”), id); query.select(user).where(predicateId); return em.createQuery(query).getSingleResult(); 但是由于我的查询的复杂性,我正在使用这样的本机查询: Query query = em.createNativeQuery(“SELECT USER.* FROM USER_ AS USER WHERE ID = ?”); query.setParameter(1, id); return (User) query.getSingleResult(); 虽然这会抛出一个强制转换exception。 我认为这是由于Admin任何字段。 我的问题是,如何使用具有相同结果的本机查询作为第一个示例选择User (包括@LOB和@ManyToOne (等等)的相同值,因为JPQL查询将返回)?

JPA / Hibernate批量(批量)插入

这是我在阅读了几个关于jpa批量插入的主题后创建的简单示例,我有2个持久对象User和Site。 一个用户可以拥有多个站点,因此我们在这里有一对多的关系。 假设我想创建用户并创建/链接几个站点到用户帐户。 考虑到我愿意为Site对象使用批量插入,这是代码的样子。 User user = new User(“John Doe”); user.getSites().add(new Site(“google.com”, user)); user.getSites().add(new Site(“yahoo.com”, user)); EntityTransaction tx = entityManager.getTransaction(); tx.begin(); entityManager.persist(user); tx.commit(); 但是,当我运行此代码(我使用hibernate作为jpa实现提供程序)时,我看到以下sql输出: Hibernate: insert into User (id, name) values (null, ?) Hibernate: call identity() Hibernate: insert into Site (id, url, user_id) values (null, ?, ?) Hibernate: call identity() Hibernate: insert into Site (id, […]

如何使用JPA注释创建连接表?

我需要使用JPA注释在我的数据库中创建一个连接表,结果将是这样的: 到目前为止,我刚刚实施了2个实体 @Entity @Table(name=”USERS”, schema=”ADMIN”) public class User implements Serializable { private static final long serialVersionUID = -1244856316278032177L; @Id @Column(nullable = false) private String userid; @Column(nullable = false) private String password; public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } public String getPassword() { return password; } public […]

HQL加入查询以急切获取大量关系

我的项目最近发现Hibernate可以采用多级关系,并且在单个连接HQL中急切地获取它们以生成我们需要的填充对象。 我们喜欢这个function,认为它会胜过懒惰的获取环境。 问题是,我们遇到的情况是,单个父母有十几个直接关系,一些子关系,其中一些在几个实例中有几十行。 结果是一个非常大的交叉产品,导致hql几乎永远地旋转它的轮子。 在我们放弃并杀死它之前,我们将记录变为11并且看到了超过100000次迭代。 很明显,虽然这种技术在某些情况下很有用,但它具有生活中的一切限制。 但是hibernate中最好的替代方案是什么呢? 我们不想懒惰加载这些,因为我们将进入更加糟糕的N + 1情况。 理想情况下,我希望让Hibernate预取所有的行和细节,但一次只做一个关系,然后将正确的细节对象保湿到正确的父对象,但我不知道它是否做了这样的事情。 建议? 更新: 所以我们得到了SQL这个查询生成的,事实certificate我错误地诊断了这个问题。 交叉产品并不是那么大。 我们直接在数据库中运行相同的查询,并在一秒钟内返回500行。 然而我们在hibernate日志中非常清楚地看到它进行了100K迭代。 是否有可能Hibernate会陷入你的人际关系或某事的循环中? 或者这应该被问为一个新问题?

使用JPA Criteria API进行分页的总行数

我正在为我的系统中的实体实现“高级搜索”类function,以便用户可以使用此实体的属性上的多个条件(eq,ne,gt,lt等)搜索该实体。 我正在使用JPA的Criteria API动态生成Criteria查询,然后使用setFirstResult()和setMaxResults()来支持分页。 一切都很好,直到这一点,但现在我想显示结果网格上的结果总数,但我没有看到直接的方式来获得Criteria查询的总计数。 这就是我的代码的样子: CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery cQuery = builder.createQuery(Brand.class); Root from = cQuery.from(Brand.class); CriteriaQuery select = cQuery.select(from); . . //Created many predicates and added to **Predicate[] pArray** . . select.where(pArray); // Added orderBy clause TypedQuery typedQuery = em.createQuery(select); typedQuery.setFirstResult(startIndex); typedQuery.setMaxResults(pageSize); List resultList = typedQuery.getResultList(); 我的结果集可能很大,所以我不想加载我的实体进行计数查询,所以请告诉我在Criteria上获取像rowCount()方法这样的总计数的有效方法(我认为它在Hibernate的Criteria中)。

如何使用JPA获取最后一个持久化实体的Id

我正在寻找一种智能且易于阅读的方式来获取使用JPA的持久化实体的id。 id是一个Integer 。 人们可以想到以下解决方案: 不使用GeneratedValue策略。 这需要在持久化之前寻找一个免费的id,然后将它放入要保留的实体中:繁琐,但有效。 使用GeneratedValue策略。 持久性提供程序将负责id生成。 这看起来更聪明,但如何获得身份证? 请参阅下面的解决方案2 MyEntity en = new MyEntity(); en.setName(“My name”); em.persist(en); System.out.println(en.getId()); 这打印出一个空id! 有什么建议么? 我正在使用MySql,EclipseLink,但需要一个可移植的解决方案。