我正在使用JPA 2.0,我的持久性提供程序是Hibernate; 但是,我想从javax中包含一个标准API,但在中心,没有2.0工件.我目前正在使用Hibernate JPA 2.0工件,但我想使用更标准的东西.
这可能吗?
谢谢,
沃尔特
使用JPA 2 Criteria Join方法,我可以执行以下操作:
//Join Example (default inner join)
int age = 25;
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Team> c = cb.createQuery(Team.class);
Root<Team> t = c.from(Team.class);
Join<Team, Player> p = t.join(Team_.players);
c.select(t).where(cb.equal(p.get(Player_.age), age));
TypedQuery<Team> q = entityManager.createQuery(c);
List<Team> result = q.getResultList();
Run Code Online (Sandbox Code Playgroud)
我怎么能用fetch方法做同样的事情,我期望Fetch接口有get路径导航方法,但它没有:
//Fetch Join Example
int age = 25;
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Team> cq = cb.createQuery(Team.class);
Root<Team> t = cq.from(Team.class);
Fetch<Team,Player> p = t.fetch(Team_.players);
cq.where(cb.equal(p.get(Player_.age), age)); //This leads to compilation error there is no such method get in interface Fetch …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用@OrderColumn
Hibernate 3.5 的注释
@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@OrderColumn(name = "pos")
private List<Children> childrenCollection;
Run Code Online (Sandbox Code Playgroud)
检索数据时,一切正常.但我不能让它重新排序列表中的元素并将新订单保存到数据库.
我想知道如何使用EclipseLink在JPA 2中实现时态表.时间上我指的是定义有效期的表.
我面临的一个问题是引用表不再具有对引用表(时态表)的外键约束,因为引用表的性质现在它们的主键包括有效期.
我发现的唯一一件事就是一个名为DAO Fusion的框架来处理这个问题.
这是一个数据模型及其类的虚构示例.它起初是一个简单的模型,不需要处理时间方面:
第一种情景:非时间模型
数据模型:
团队:
@Entity
public class Team implements Serializable {
private Long id;
private String name;
private Integer wins = 0;
private Integer losses = 0;
private Integer draws = 0;
private List<Player> players = new ArrayList<Player>();
public Team() {
}
public Team(String name) {
this.name = name;
}
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQTEAMID")
@SequenceGenerator(name="SEQTEAMID", sequenceName="SEQTEAMID", allocationSize=1)
public Long getId() {
return id;
}
public …
Run Code Online (Sandbox Code Playgroud) 我需要在项目的源代码上运行注释处理器.注释处理器不应该成为项目的传递依赖项,因为它只需要注释处理而不需要其他内容.
这是我用于此的完整(非工作)测试pom:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Test annotations</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hibernate-jpamodelgen.version>1.2.0.Final</hibernate-jpamodelgen.version>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<annotationProcessors>
<annotationProcessor>
org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</annotationProcessor>
</annotationProcessors>
<debug>true</debug>
<optimize>true</optimize>
<source>1.6</source>
<target>1.6</target>
<compilerArguments>
<AaddGeneratedAnnotation>true</AaddGeneratedAnnotation>
<Adebug>true</Adebug>
</compilerArguments>
</configuration>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${hibernate-jpamodelgen.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
我org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
在测试的插件配置中明确定义为注释处理器,我知道它不应该是必需的.
我遇到的问题是hibernate-jpamodelgen
依赖项没有添加到编译器类路径中,因此找不到注释处理器并且构建失败.
根据这个答案,我尝试将依赖项添加为构建扩展(不确定我理解那些应该是什么!),如下所示:
<extensions>
<extension>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${hibernate-jpamodelgen.version}</version>
</extension>
</extensions>
Run Code Online (Sandbox Code Playgroud)
这也不会添加hibernate-jpamodelgen
到编译器类路径中.
到目前为止,我发现唯一可行的方法是在该<dependencies>
部分中将依赖项添加到项目中.这有一个令人遗憾的副作用,hibernate-jpamodelgen …
我已经看了JPA 2.0 Criteria API,但我发现它与Hibernate Criteria不同,太麻烦了.是否有充分的理由使用JPA 2.0 Criteria API而不是使用JPA-QL?感谢您的意见.
我有一个内存数据源:
java.sql.Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:testdb", "sa", "");
emf = Persistence.createEntityManagerFactory("manager");
Run Code Online (Sandbox Code Playgroud)
但是现在我被卡住了.我想将它用作J2SE应用程序中的JPA数据源.我已经浏览了整个网络,但所有信息都与J2EE有关.
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="manager">
<jta-data-source>/*What to enter here?*/</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud) 假设我有一个会议实体.每次会议都有一位与会者和一个会面日期.在我的会议桌内,我可能会为每位与会者举行多次会议,每次会议的日期各不相同.我需要一个JPA查询,它只为所有与会者选择最新的会议.例如,如果我的表看起来像这样
Meeting ID | Attendee ID | Meeting Date
1 | 1 | 6/1/2011
2 | 2 | 6/1/2011
3 | 1 | 6/6/2011
4 | 3 | 6/6/2011
Run Code Online (Sandbox Code Playgroud)
我的结果应该是
Meeting ID | Attendee ID | Meeting Date
2 | 2 | 6/1/2011
3 | 1 | 6/6/2011
4 | 3 | 6/6/2011
Run Code Online (Sandbox Code Playgroud)
使用JPA 2对抗postgres.会议有1-1参加者和一个简单的时间戳日期.我怀疑我需要做一个小组by和max(blah),也许是一个加入我自己,但我不确定最好的方法来解决这个问题.
更新: 在晚上玩这个之后,我仍然没有可接受的JPQL解决方案.这是我到目前为止:
select m from Meeting m
where m.meetingDate in
( select max(meet.meetingDate)
from Meeting meet group by meet.attendee )
Run Code Online (Sandbox Code Playgroud)
我有其他与此问题无关的其他条件,例如由与会部门过滤等等.这有效的唯一原因是因为我们将会议日期跟踪到第二(或更精细),并且在同一时间召开两次会议的可能性很小.我们正在为它们添加一些Java内容,以便只为每个与会者提供最后一次会议,以防我们同时获得两个会议,但这是一个非常糟糕的解决方案.在查询中获取所有内容真的不应该太难,但我还没弄明白.
Update2:添加sql标签,因为如果我需要使用sql创建一个视图并创建一个JPA对象来映射到视图我就可以了.
我想使用CriteriaBuilder在我加入2个表的地方进行查询.在MySQL中,我想要的查询看起来像这样:
SELECT * FROM order
LEFT JOIN item
ON order.id = item.order_id
AND item.type_id = 1
Run Code Online (Sandbox Code Playgroud)
我想获得所有订单,如果他们有#1类型的商品,我想加入这个商品.但是,如果没有找到#1类型的项目,我仍然想要获得订单.我无法弄清楚如何使用CriteriaBuilder进行此操作.我所知道的是:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
Root<Order> order = cq.from(Order.class);
Join<Order, Item> item = order.join(Order_.itemList, JoinType.LEFT);
Join<Item, Type> type = order.join(Item_.type, JoinType.LEFT);
cq.select(order);
cq.where(cb.equal(type.get(Type_.id), 1));
Run Code Online (Sandbox Code Playgroud)
此查询已中断,因为它在MySQL中产生类似的结果:
SELECT * FROM order
LEFT JOIN item
ON order.id = item.order_id
WHERE item.type_id = 1
Run Code Online (Sandbox Code Playgroud)
结果将只包含类型为#1的订单.没有订单被排除在外.如何使用CriteriaBuilder创建第一个示例中的查询?
重新启动Eclipse后,我的项目中出现以下错误:
该项目具有JPA方面,但不能创建JPA项目.有关详细信息,请参阅错误日志.
我所做的一切(清洁项目,maven更新等)都将摆脱错误.我的JPA内容图标仍然显示为灰色.
看起来这是Eclipse错误中已解决的错误 ......但是为什么我仍然得到它?我应该向Eclipse提交错误报告吗?
jpa-2.0 ×10
jpa ×6
java ×5
hibernate ×3
criteria-api ×1
eclipse ×1
eclipselink ×1
fetch ×1
hsqldb ×1
jpql ×1
maven ×1
maven-2 ×1
maven-3 ×1
one-to-many ×1
persistence ×1
sql ×1