查看在数据库中执行的SQL查询的OpenJPA配置是什么?我想查看在日志或控制台中执行的所有参数的查询,而不是查看JPQL查询
我正在开发一个Java应用程序,它需要在不同的PostgreSQL服务器中对数据进行水平分区.我想使用JPA框架和Spring进行事务管理.
使用JPA分割数据的最流行框架似乎是Hibernate Shards,它似乎不再处于开发阶段,而OpenJPA Slice则不支持虚拟分片(我的要求之一).我还缺少其他任何选项,或者解决OpenJPA限制的方法吗?
提前感谢您的意见!
我有一个拥有另一个实体的实体:
//psuedocode
public class ClassA{
private String name;
@OneToOne
private ClassB classb;
}
public class ClassB{
private String thing1;
private String thing2;
private String thing3;
}
Run Code Online (Sandbox Code Playgroud)
当我检索ClassA对象时,我不想看到ClassB.thing3,但我确实想看到thing1和thing2:
{
"name":"classa",
"classb":{
"thing1":"hi",
"thing2":"there"
}
}
Run Code Online (Sandbox Code Playgroud)
但如果我查询ClassB,我想看到一切:
{"thing1":"hi",
"thing2":"there",
"thing3":"joseph"}
Run Code Online (Sandbox Code Playgroud)
所以我不能只在thing3上放一个忽略注释,因为那时我会在第二次获取时忽略它.我尝试了Converter<ClassB>,但是这迫使我实施toString()和fromString()对JSON,其死亡的JSON对象转换为Java端(转换器需要一个字符串,但得到的对象,而不是).
我想尽可能避免自己构建/解析JSON对象,如果可能的话让我的json提供者完成工作.我在约翰逊.
我想更新一个具有colum NAME值为'PCNAME'的表的所有字段.我想要更新的表名是XYZ.我想只更新一些字段而不保持一些不变.
这会影响很多行而不是单行,因为会有很多行使用NAME ='PCNAME'如何使用JPA.I具有与此表关联的实体类.
我试图使用maven插件增强来自另一个Jar的Entity类openjpa-maven-plugin,不幸的是我没有找到正确的方法来实现它.
我在jar中打包的MyPojo模块有一个类:MyDomainmy-domain.jar
public class MyPojo {
private Long id;
...
}
Run Code Online (Sandbox Code Playgroud)
在我的第二个项目MyJpa打包中my-jpa.jar,它取决于模块my-domain.jar,Maven配置为使用Build Time OpenJPA Enhancer,具体如下:
<plugin>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa-maven-plugin</artifactId>
<configuration>
<includes>**/entity/*.class</includes>
<addDefaultConstructor>true</addDefaultConstructor>
<enforcePropertyRestrictions>true</enforcePropertyRestrictions>
</configuration>
<executions>
<execution>
<id>enhancer</id>
<phase>process-classes</phase>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我正在使用orm.xml在persistence.xml以下位置声明的XML映射:
...
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<mapping-file>META-INF/orm.xml</mapping-file>
...
Run Code Online (Sandbox Code Playgroud)
并使用类似于的orm.xml:
<entity class="MyPojo" access="FIELD">
<table name="MYPOJO"/>
<attributes>
<id name="id">
<generated-value strategy="AUTO"/>
</id>
</attributes>
</entity>
Run Code Online (Sandbox Code Playgroud)
运行mvn install会出现以下错误:
此配置不允许运行时优化,但在构建时或使用javaagent在类加载时未增强以下列出的类型: …
具有'in'表达式的JPA条件API转换为多个'OR'而不是'in'
例如
我的主要模特
public class Person {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
private Department department;
...
}
Run Code Online (Sandbox Code Playgroud)
多对一的关系
public class Department {
@Id
@Column(name="department_id")
private Integer departmentId;
@OneToMany(mappedBy="department")
private List<Person> person;
...
}
Run Code Online (Sandbox Code Playgroud)
在persistence.xml中定义了这两个模型(注意:它没有指定任何db方言)
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="primary" transaction-type="JTA">
<jta-data-source>java:openejb/Resource/jdbc/myDS</jta-data-source>
<class>com.xyz.Person</class>
<class>com.xyz.Department</class>
...
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="openjpa.Log" value="${open.jpa.log}" />
<property name="openjpa.ConnectionFactoryProperties" value="printParameters=true" />
<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported" />
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
以下是使用Criteria API构建查询的代码:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> criteriaQuery = cb.createQuery(Person.class);
Root<Person> personRoot = criteriaQuery.from(Person.class); …Run Code Online (Sandbox Code Playgroud) IBM建议使用EntityManagers的最佳做法是get/use/close.如果EntityManager未关闭,则多个线程可能会使用相同的EntityManager,这将导致以下错误:
<openjpa-2.1.2-SNAPSHOT-r422266:1179900 fatal general error> org.apache.openjpa.persistence.PersistenceException: Multiple concurrent threads attempted to access a single broker. By default brokers are not thread safe; if you require and/or intend a broker to be accessed by more than one thread, set the openjpa.Multithreaded property to true to override the default behavior.
Run Code Online (Sandbox Code Playgroud)
如果加载一个将OneToMany集合映射为fetch = LAZY的对象,如下所示:
public T find(Object id) {
T t = null;
EntityManager em = getEm();
t = em.find(type, id);
em.close();
return t;
}
EntityManager getEm() {
if(this.em ==null || !this.em.isOpen()) { …Run Code Online (Sandbox Code Playgroud) 我创建了一个小型JPA项目来保存学生记录.我使用Oracle数据库.我使用OpenJPA作为JPa提供程序.
我已正确创建了Table学生和相关序列.
学生实体课程
@Entity
@Table(name = "Student")
public class Student implements Serializable {
private int id;
private String name;
private static final long serialVersionUID = 1L;
public Student() {
super();
}
@Id
@Column(name = "ID")
@SequenceGenerator(name = "TRAIN_SEQ", sequenceName = "STUDENT_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TRAIN_SEQ")
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "NAME")
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = …Run Code Online (Sandbox Code Playgroud) 我们需要确保在JPQL查询中仅返回过去30天内的结果.一个例子如下:
Date now = new Date();
Timestamp thirtyDaysAgo = new Timestamp(now.getTime() - 86400000*30);
Query query = em.createQuery(
"SELECT msg FROM Message msg "+
"WHERE msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > {ts, '"+thirtyDaysAgo+"'}");
List result = query.getResultList();Run Code Online (Sandbox Code Playgroud)
这是我们收到的错误:
<openjpa-1.2.3-SNAPSHOT-r422266:907835 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: An error occurred while parsing the query filter 'SELECT msg FROM BroadcastMessage msg WHERE msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > {ts, '2010-04-18 04:15:37.827'}'. Error message: org.apache.openjpa.kernel.jpql.TokenMgrError: Lexical error at line 1, column 217. Encountered: "{" (123), after : "" … 我需要我的数据按空排序而不是空排序。像下面这样:
Column A
null
null
null
8
10
5
Run Code Online (Sandbox Code Playgroud)
这意味着一旦所有空值都在顶部,其余的值根本不应该被排序并按原样出现。任何想法如何使用 jpa 查询/本机查询来完成。