我们如何使用Hibernate或JPA调用存储过程? 最佳答案 考虑以下仅返回基本返回值的存储过程:CREATEORREPLACEPROCEDUREcount_comments(postIdINNUMBER,commentCountOUTNUMBER)ASBEGINSELECTCOUNT(*)INTOcommentCountFROMpost_commentWHEREpost_id=postId;END;您可以使用标准JPA调用它:StoredProcedureQueryquery=entityManager.createStored
我喜欢JPA中用于静态查询的命名查询的想法,但我经常希望获得查询的计数结果以及来自查询的某个子集的结果列表。我宁愿不写两个几乎相同的NamedQueries。理想情况下,我想要的是:@NamedQuery(name="getAccounts",query="SELECTaFROMAccount")..Queryq=em.createNamedQuery("getAccounts");Listr=q.setFirstResult(s).setMaxResults(m).getResultList();intcount=q.getCount();假设m为10,s为0,Account中有40
是否可以在JPA中选择按引用实体分组的数据?我的意思是:我有两个实体-保险和引用的多对一车辆。保险实体有validTill字段(当然还有vehicle字段)。我想选择车辆和最新的保险。下面的查询不起作用:SELECTDISTINCTv.vehicle,max(v.validTill)aslastValidTillFROMTraInsurancevGROUPBYv.vehicleORDERBYlastValidTill上面的查询失败并出现错误:ERROR:column"travehicle1_.id_brand"mustappearintheGROUPBYclauseorbeusedin
@EntitypublicclassReportextendsModel{publicDatedate;publicdoubleavailability;@ElementCollection@Cascade(value={CascadeType.ALL})publicMapcategories;}在我的一份工作中,我有以下代码:intn=MonthlyReport.delete("date=?",date);删除实体总是失败,错误如下:TheDELETEstatementconflictedwiththeREFERENCEconstraint"FK966F0D9A66DB1E54".T
我有以下实体:@EntitypublicclassShirtimplementsSerializable{@Id@Size(max=9)privateStringid;@ElementCollection@CollectionTable(name="SHIRT_COLORS")@Column(name="color")privateListcolors=newArrayList();...我设置hibernate为autocreate时创建的collections表是SHIRT_COLORSshirt_idcolor我如何注释我的实体,以便连接列不是实体和pk的串联,以便创建的表是:S
我正在寻找一种从JPA实体创建数据传输对象(DTO)的好方法,反之亦然。我想将DTO作为JSON发送给客户端,然后接收修改后的DTO并将其保存回数据库。在从JSON解析到它的Java类之后,从EntityManager对接收到的对象执行合并方法是最容易的。例如有下面的Entity和保存修改对象的Rest方法:@Entity@Table(name="CUSTOMER")publicclassCustomer{ @Id Longid; @Version Longversion; Stringname; Stringaddress; Stringlogin;
摘自ProEJB3JPA一书:Themostcommonstrategytohandlethis(-updateentities-)inJavaEEapplicationthatusesJPAistoplacetheresultsofthechangesintodetachedentityinstancesandmergethependingchangesintoapersistencecontextsothattheycanbewrittentothedatabase例子:emp参数是一个分离的实体@StatelesspublicclassEmployeeServiceBean{@P
我的问题是为什么flush不起作用:publicvoidejbService(){Customerc=em.find(Customer.class,1);c.setName("newName");em.flush();//atthispointwhenIquerymysqltableIcannotsee"newName"thread.sleep(10000);c.setName("anotherName");}完成该方法后,我在数据库中看到“anotherName”我也用em.find(Customer.class,1,Lock.None);检查它但还是不行RGDS
我目前正在使用@PostPersist和@PostUpdate,在这些触发器中我正在持久化其他实体。问题是,这些触发器是否在同一事务中,如果不是,是否可以强制执行?对我来说,它是这样工作的。当我查看日志时,事务不存在(它是在触发器启动之前提交的)这阻止了我(在注入(inject)bean的持久方法上没有REQUIRES_NEW)将其他实体保存在数据库。REQUIRED属性被完全忽略,MANDATORY属性不抛出异常。这可能是JUnit的问题(因为我处于开发阶段并且没有在完整环境中测试行为。)?如果无法在此触发器上扩展事务,如何确保回滚发生在@PostPersist和@PostUpdat
在我们的应用程序中,我们需要有只能分配一次的字段。一开始我们想到的是封装字段,让setters私有(private)化。然而,一些问题引起了:没有公共(public)setter,Hibernate是否仍然能够从数据库映射字段?我能否去除setter并使字段仅在实体构造函数中可变?最后,是否有任何标准的JPA方法可以使字段不可变?提前致谢。 最佳答案 尝试@Column(updatable=false)并将您的二传手设为私有(private)。(如果你愿意,请公开你的setter/getter)我认为这是最佳实践。P.S.:如果您对