相关疑难解决方法(0)

JPA:如何根据ID以外的字段值获取实体?

在JPA(Hibernate)中,当我们自动生成ID字段时,假设用户不知道该密钥.因此,当获得实体时,用户将基于除ID之外的某些字段进行查询.在这种情况下我们如何获得实体(因为em.find()不能使用).

我知道我们可以使用查询并稍后过滤结果.但是,是否有更直接的方式(因为这是我理解的一个非常常见的问题).

java hibernate jpa

48
推荐指数
7
解决办法
10万
查看次数

具有任意AND子句的动态spring数据jpa存储库查询

我正在使用Spring data jpa repositories,要求提供不同字段的搜索功能.搜索之前输入的字段是optional.I有5场说EmployeeNumber,Name,Married,ProfessionDateOfBirth.
这里我只需要用户查询给定的值,其他字段应该被忽略.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...??

使用可选字段实现搜索选项的最佳方法是什么?

java spring querydsl spring-data spring-data-jpa

42
推荐指数
3
解决办法
5万
查看次数

JPA Criteria API - 如何添加JOIN子句(作为一般句子)

我正在尝试动态构造查询,我的下一个目标是添加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)

java api join criteria-api jpa-2.0

31
推荐指数
4
解决办法
15万
查看次数

如何使用JPA检查记录是否存在

我想知道给定记录是否存在于数据库中.到目前为止,我已经通过编写JPA查询并通过getSingleResult()方法运行它来实现这一目标.NoResultException如果具有给定参数的记录不存在,则会抛出一个.当然,记录不是必须存在的,所以这有时是正常行为,这就是为什么我问自己,是否需要抛出一个我必须通过catch块来处理的异常?据我所知,异常处理的成本相当大,所以我对这个解决方案并不是很满意,而且,我甚至不需要这个对象,我只需要知道它在DB中是否存在.

有没有更好的方法来检查对象是否存在?例如.使用getResultList()和检查它的大小可能吗?

java jpa

26
推荐指数
3
解决办法
5万
查看次数

Maven 3 - 如何添加注释处理器依赖?

我需要在项目的源代码上运行注释处理器.注释处理器不应该成为项目的传递依赖项,因为它只需要注释处理而不需要其他内容.

这是我用于此的完整(非工作)测试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 …

java maven-3 maven annotation-processing jpa-2.0

25
推荐指数
4
解决办法
4万
查看次数

Eclipselink 2.5使用Maven生成元模型

我想知道如何使用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)

jpa eclipselink maven

17
推荐指数
2
解决办法
2万
查看次数

Hibernate CriteriaBuilder加入多个表

我正在尝试使用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脚本: …

java mysql hibernate hibernate-mapping hibernate-criteria

14
推荐指数
1
解决办法
2万
查看次数

Netbeans中的JPA 2.0元模型?

我已经读过,自版本6.9以来,Netbeans包含注释处理支持,例如,需要一个功能来生成JPA 2.0实体的元模型.

但是,我找不到任何能够准确显示如何操作的示例或文档.你们有没有成功的人?

java netbeans criteria-api annotation-processing jpa-2.0

12
推荐指数
1
解决办法
5796
查看次数

超类的JPA 2 Criteria查询属性

我有两个实体:

@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)

criteria-api jpa-2.0

5
推荐指数
1
解决办法
1675
查看次数

如何配置JPAMetaModelEntityProcessor以不获取"重复类"错误?

我试图使用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)

java jpa maven

3
推荐指数
1
解决办法
5511
查看次数

是否可以为 Java 11 和 java 模块生成 hibernate 元模型?

我有一个带有 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)

java hibernate jpa metamodel java-module

2
推荐指数
1
解决办法
4940
查看次数

Spring JPA - 更新多个字段的最佳方式

我是新手使用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 spring hibernate jpa

0
推荐指数
1
解决办法
5201
查看次数