相关疑难解决方法(0)

我可以将enum参数用于JpaRepository nativeQuery吗?

实体看起来像这样:

@Getter
@Setter
@Entity
public class Application {
@Id
private Long id;
@Enumerated(EnumType.STRING)
private ApplicationStatus status;
}
Run Code Online (Sandbox Code Playgroud)

代码以这种方式工作:

public interface ApplicationRepository extends JpaRepository<Application, Long> {
@Query("SELECT app FROM #{#entityName} AS app WHERE app.status LIKE :status")
List<Application> find(@Param("status") ApplicationStatus status);
Run Code Online (Sandbox Code Playgroud)

但是使用nativeQuery的相同代码段 - 不会:

@Query(value = "SELECT app.* FROM application AS app WHERE app.status LIKE :status", nativeQuery = true)
List<Application> findNative(@Param("status") ApplicationStatus status);
}
Run Code Online (Sandbox Code Playgroud)

而且我没有任何异常,只是空列表.

我怎样才能解决这个问题?是否有可能使用enumnativeQuery

PS我可以String转入方法而不是ApplicationStatus但也许有另一种选择?

java sql enums hibernate spring-data-jpa

18
推荐指数
4
解决办法
2529
查看次数

Spring Data JPA方法+ REST:枚举到整数转换

我有一个端点:

/api/offers/search/findByType?type=X
Run Code Online (Sandbox Code Playgroud)

这里X应该是一个Integer值(我的序数值OfferType实例),而春季认为X一个String,将其应用StringToEnumConverterFactoryStringToEnum转换.

public interface OfferRepository extends PagingAndSortingRepository<Offer, Long> {

    List<Offer> findByType(@Param("type") OfferType type);

}
Run Code Online (Sandbox Code Playgroud)

所以我编写了一个自定义Converter<Integer, OfferType>,它只是通过给定的序数来获取实例:

public class IntegerToOfferTypeConverter implements Converter<Integer, OfferType> {

    @Override
    public OfferType convert(Integer source) {
        return OfferType.class.getEnumConstants()[source];
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我用一个正确的注册Configuration:

@EnableWebMvc
@Configuration
@RequiredArgsConstructor
public class GlobalMVCConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new IntegerToOfferTypeConverter());
    }

}
Run Code Online (Sandbox Code Playgroud)

并且我被期望所有请求都findByType?type=X将通过我的转换器,但他们没有.

有没有办法说所有定义为请求参数的枚举必须作为一个提供Integer?此外,有什么方法可以在全球范围内说出来,而不仅仅是针对特定的枚举?

编辑:我 …

java spring spring-data-jpa spring-data-rest spring-boot

6
推荐指数
1
解决办法
2965
查看次数

Hibernate 在 Enum Compare 上抛出 Query SemanticException:无法解释路径表达式

有谁知道为什么 Hibernate 会抛出这个错误?

org.hibernate.query.SemanticException: Could not interpret path expression 'com.example.entity.security.AccountStatus.Description.ACTIVE'
at org.hibernate.query.hql.internal.BasicDotIdentifierConsumer$BaseLocalSequencePart.resolvePathPart(BasicDotIdentifierConsumer.java:256) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.BasicDotIdentifierConsumer.consumeIdentifier(BasicDotIdentifierConsumer.java:91) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSimplePath(SemanticQueryBuilder.java:4808) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitIndexedPathAccessFragment(SemanticQueryBuilder.java:4755) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitGeneralPathFragment(SemanticQueryBuilder.java:4724) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitGeneralPathExpression(SemanticQueryBuilder.java:1423) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.grammars.hql.HqlParser$GeneralPathExpressionContext.accept(HqlParser.java:6963) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
Run Code Online (Sandbox Code Playgroud)

据报道,具有错误查询的存储库如下所示:

org.hibernate.query.SemanticException: Could not interpret path expression 'com.example.entity.security.AccountStatus.Description.ACTIVE'
at org.hibernate.query.hql.internal.BasicDotIdentifierConsumer$BaseLocalSequencePart.resolvePathPart(BasicDotIdentifierConsumer.java:256) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.BasicDotIdentifierConsumer.consumeIdentifier(BasicDotIdentifierConsumer.java:91) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSimplePath(SemanticQueryBuilder.java:4808) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitIndexedPathAccessFragment(SemanticQueryBuilder.java:4755) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitGeneralPathFragment(SemanticQueryBuilder.java:4724) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitGeneralPathExpression(SemanticQueryBuilder.java:1423) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.grammars.hql.HqlParser$GeneralPathExpressionContext.accept(HqlParser.java:6963) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
Run Code Online (Sandbox Code Playgroud)

Description实体内部的enumAccountStatus看起来像这样:

@Repository
public interface UserAccountRepository extends JpaRepository<UserAccount, Long> {

    @EntityGraph(type = EntityGraph.EntityGraphType.FETCH, attributePaths = {
            "accountStatus"
    }) …
Run Code Online (Sandbox Code Playgroud)

spring hibernate jpa

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