在JPA(Hibernate)中,当我们自动生成ID字段时,假设用户不知道该密钥.因此,当获得实体时,用户将基于除ID之外的某些字段进行查询.在这种情况下我们如何获得实体(因为em.find()不能使用).
我知道我们可以使用查询并稍后过滤结果.但是,是否有更直接的方式(因为这是我理解的一个非常常见的问题).
我正在使用Spring data jpa repositories,要求提供不同字段的搜索功能.搜索之前输入的字段是optional.I有5场说EmployeeNumber,Name,Married,Profession和DateOfBirth.
这里我只需要用户查询给定的值,其他字段应该被忽略.Ex,
Input : EmployeeNumber: ,Name:St,Married: ,Professsion:IT,DateOfBirth:
Query : Select * from Employee e where Name like 'St%' and Profession like 'IT%';
Input : EmployeeNumber:10,Name: ,Married: ,Professsion:IT,DateOfBirth:
Query : Select * from Employee e where EmployeeNumber like '10%' and Profession like 'IT%';
Run Code Online (Sandbox Code Playgroud)
所以我们在这里考虑输入和查询的值.在这种情况下,春季数据是具有限制中提到的这篇文章(不可扩展,所有可能出现的问题,应书面)我使用的Querydsl,但仍存在问题,null待开发领域应该被忽略,几乎所有可能的查询需要.在这case 31 queries.如果搜索字段是6,7,8...??
使用可选字段实现搜索选项的最佳方法是什么?
我正在尝试动态构造查询,我的下一个目标是添加JOIN子句(我不知道如何使用API).
例如,到目前为止,这段代码对我有用:
...
Class baseClass;
...
CriteriaBuilder cb = JpaHandle.get().getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(this.baseClass);
Root entity_ = cq.from(this.baseClass);
Predicate restrictions = null;
...
restrictions = cb.conjunction();
restrictions = cb.and(restrictions, entity_.get("id").in(this.listId));
...
cq.where(restrictions);
...
Query qry = JpaHandle.get().createQuery(cq);
Run Code Online (Sandbox Code Playgroud)
(注意:JpaHandle来自wicket-JPA实现)
我的愿望是添加JOIN子句(尽可能通用)!
我在类中有特定的注释(this.baseClass)
例如 :
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "assay_id", nullable = false)
Run Code Online (Sandbox Code Playgroud)
那么,在标准JPA中有没有这样的方法呢?(注意:这不编译)
这是一个实际的失败方法:
...
Join<Experiment,Assay> experimentAssays = entity_.join( entity_.get("assay_id") );
Run Code Online (Sandbox Code Playgroud)
或者像那样:
...
CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> c = q.from(Customer.class);
SetJoin<Customer, PurchaseOrder> o = c.join(Customer_.orders);
Run Code Online (Sandbox Code Playgroud)
对我来说,如果它可能更加通用,它会很棒......:
...
Join joinClause = …Run Code Online (Sandbox Code Playgroud) 我想知道给定记录是否存在于数据库中.到目前为止,我已经通过编写JPA查询并通过getSingleResult()方法运行它来实现这一目标.NoResultException如果具有给定参数的记录不存在,则会抛出一个.当然,记录不是必须存在的,所以这有时是正常行为,这就是为什么我问自己,是否需要抛出一个我必须通过catch块来处理的异常?据我所知,异常处理的成本相当大,所以我对这个解决方案并不是很满意,而且,我甚至不需要这个对象,我只需要知道它在DB中是否存在.
有没有更好的方法来检查对象是否存在?例如.使用getResultList()和检查它的大小可能吗?
我需要在项目的源代码上运行注释处理器.注释处理器不应该成为项目的传递依赖项,因为它只需要注释处理而不需要其他内容.
这是我用于此的完整(非工作)测试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 …
我想知道如何使用Maven和Eclipselink 2.5生成静态元模型.通过在运行Eclipselink 2.4时将这些行添加到pom.xml,它运行良好.
// Generate meta model for eclipselink 2.4 (does not work for 2.5)
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<version>1.3.1</version>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<compilerArguments>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</compilerArguments>
<processors>
<processor>org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor</processor>
</processors>
<outputDirectory>${project.build.directory}/generated-sources/meta-model</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但似乎自2.4以来出现了一些变化,因为我得到了以下错误:
[INFO] javac option: -proc:only
[INFO] javac option: -Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml
[INFO] javac option: -processor
[INFO] javac option: org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
[INFO] javac option: -s
[INFO] javac option: /home/asdf/target/generated-sources/meta-model
[INFO] diagnostic error: Annotation processor 'org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor' not found
[INFO] diagnostic warning: Annotation processing without compilation requested but no processors …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用hibernate criteriabuilder加入4个表.
下面分别是表..`
@Entity
public class BuildDetails {
@Id
private long id;
@Column
private String buildNumber;
@Column
private String buildDuration;
@Column
private String projectName;
}
@Entity
public class CodeQualityDetails{
@Id
private long id;
@Column
private String codeHealth;
@ManyToOne
private BuildDetails build; //columnName=buildNum
}
@Entity
public class DeploymentDetails{
@Id
private Long id;
@Column
private String deployedEnv;
@ManyToOne
private BuildDetails build; //columnName=buildNum
}
@Entity
public class TestDetails{
@Id
private Long id;
@Column
private String testStatus;
@ManyToOne
private BuildDetails build; //columnName=buildNum
}
Run Code Online (Sandbox Code Playgroud)
在这4个表中,我想为MySQL执行以下sql脚本: …
我已经读过,自版本6.9以来,Netbeans包含注释处理支持,例如,需要一个功能来生成JPA 2.0实体的元模型.
但是,我找不到任何能够准确显示如何操作的示例或文档.你们有没有成功的人?
我有两个实体:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GEN_Person")
@SequenceGenerator(name = "GEN_Person", sequenceName = "seq_person" , initialValue = 1, allocationSize = 10)
@Column(nullable = false)
private Long id;
private String familienname;
private String vorname;
...
}
Run Code Online (Sandbox Code Playgroud)
和子类:
@Entity
@DiscriminatorValue(value = "KIND")
public class Kind extends Person implements Serializable {
... // other properties
}
Run Code Online (Sandbox Code Playgroud)
我想通过jpa 2中的条件查询找到所有种类的实体。
我的查询:
public List<Kind> find(String f_name, String v_name) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Kind> cq = …Run Code Online (Sandbox Code Playgroud) 我试图使用hibernate-jpamodelgen与maven-processor-plugin一起使用此答案的配置生成我的JPA元模型作为我的Maven构建的一部分.
但是,当我进行构建时,当我尝试执行以下操作时出现以下错误mvn clean install:
[ERROR] C:\Users\ArtB\Documents\code\xxx\target\classes\me\Page_.java:[11,16] error: duplicate class: me.Page_
Run Code Online (Sandbox Code Playgroud)
从一些调查来看,问题是生成的元模型似乎发生了两次或者其他什么.
如果我运行clear; mvn clean generate-sources; ls -l target\generated-sources\apt\me我只有文件_Page.java,没有其他文件.
在compile阶段之后target\classes\文件夹只包含\me\_Page.java...这看起来很奇怪,因为我认为.class文件应该出现在"\ target\classes"文件夹中.
我使用debug(即-X)运行构建,并没有看到任何可疑的东西.
我怀疑这很重要,但这是我的模特.
package me;
@Entity
@Table(name="Pages")
public class Page {
@Id @GeneratedValue
private long id;
private String title;
private Instant lastRetrieved;
private PageCategory category;
private URL source;
@Lob
private String contents;
//hashcode, equals, getters & setters omitted
}
Run Code Online (Sandbox Code Playgroud)
和
package …Run Code Online (Sandbox Code Playgroud) 我有一个带有 JPA 实体和 persistence.xml 的 java 模块,我想生成元模型。我尝试了两种变体。
变体1
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>5.4.14.Final</version>
</annotationProcessorPath>
<path>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</path>
<path>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</path>
</annotationProcessorPaths>
</configuration>
<dependencies>
</dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)
结果:
Caused by: java.lang.NullPointerException
at org.hibernate.jpamodelgen.ClassWriter.writeGeneratedAnnotation(ClassWriter.java:202)
at org.hibernate.jpamodelgen.ClassWriter.generateBody(ClassWriter.java:100)
at org.hibernate.jpamodelgen.ClassWriter.writeFile(ClassWriter.java:53)
at org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor.createMetaModelClasses(JPAMetaModelEntityProcessor.java:145)
at org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor.process(JPAMetaModelEntityProcessor.java:135)
at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:972)
at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:888)
at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1214)
at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1326)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1258)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:936)
at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:147)
... 28 more
Run Code Online (Sandbox Code Playgroud)
变体2
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<version>3.3.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase> …Run Code Online (Sandbox Code Playgroud) 我是新手使用JPA并尝试将我的代码从JdbcTemplate转换为JPA.最初我通过获取列的映射及其值来更新我的列的子集,并自己创建SQL Update字符串并使用DAO执行它.我想知道使用JPA做类似事情的最佳方法是什么?
编辑:
我如何将此代码从我的DAO转换为JPA中的等效代码?
public void updateFields(String userId, Map<String, String> fields) {
StringBuilder sb = new StringBuilder();
for (Entry<String, String> entry : fields.entrySet()) {
sb.append(entry.getKey());
sb.append("='");
sb.append(StringEscapeUtils.escapeEcmaScript(entry.getValue()));
sb.append("', ");
}
String str = sb.toString();
if (str.length() > 2) {
str = str.substring(0, str.length() - 2); // remove ", "
String sql = "UPDATE users_table SET " + str + " WHERE user_id=?";
jdbcTemplate.update(sql, new Object[] { userId },
new int[] { Types.VARCHAR });
}
}
Run Code Online (Sandbox Code Playgroud) java ×10
jpa ×6
hibernate ×4
jpa-2.0 ×4
criteria-api ×3
maven ×3
spring ×2
api ×1
eclipselink ×1
java-module ×1
join ×1
maven-3 ×1
metamodel ×1
mysql ×1
netbeans ×1
querydsl ×1
spring-data ×1