【问题标题】:Named query not known :: DropWizard Hibernate命名查询未知 :: DropWizard Hibernate
【发布时间】:2021-04-19 18:58:32
【问题描述】:

我有一个实体类定义为:

@Entity
@Table(name = "some_table")
@NamedQueries({
        @NamedQuery(name = "SomeTable.getSomeTableForAmount",
                query = "select x from SomeTable x where :amount >= x.startingAmount AND :amount <= x.endingAmount " +
                        "AND product = :product"
        )
})

@Getter
@Setter
public class SomeTable {
    @Id
    private String id;
    private BigDecimal startingAmount;
    private BigDecimal endingAmount;
    private BigDecimal minimumDueAmount;
    private Product product;
}

该类的 DAO 如下所示:

public class SomeTableDao extends AbstractDAO<SomeTable> implements ISomeTableDao {
    @Inject
    public SomeTableDao(SessionFactory sessionFactory) {
        super(sessionFactory);
    }

    @Override
    public Optional<SomeTable> getSomeTableForAmount(BigDecimal amount, Product product) {
        return namedQuery("SomeTable.getSomeTableForAmount")
                .setParameter("amount", amount)
                .setParameter("product", product)
                .setMaxResults(1)
                .list()
                .stream()
                .map(s -> (SomeTable) s)
                .findFirst();
    }
}

在从资源执行此操作时,我遇到异常声明 Named query not known: SomeTable.getSomeTableForAmount

资源方法用@UnitOfWork注解。

我还注意到查询没有添加到NamedQueryRepository 中的namedQueryDefinitionMap。

【问题讨论】:

  • 也许你想用namedQuery("SomeTable.getSomeForAmount")代替namedQuery("SomeTable.getMinimumDueForAmount")
  • @SternK 这个名字真的很重要吗?因为我已经在我的实体类中将其添加到 @NamedQueries 中。
  • 还尝试在所有地方更改名称,但不起作用。我注意到查询没有添加到 NamedQueryRepository 中的 namedQueryDefinitionMap。
  • 请出示您的方法namedQuery定义。

标签: java hibernate dropwizard


【解决方案1】:

由于您已将查询命名为 SomeTable.getSomeTableForAmount,因此您的代码正在尝试在 Sometable 类中为该命名查询查找常量 getSomeTableForAmount。

试试这个:

@Entity
@Table(name = "some_table")
@NamedQueries({
        @NamedQuery(name = "SomeTable.getSomeTableForAmount",
                query = "select x from SomeTable x where :amount >= x.startingAmount AND :amount <= x.endingAmount " +
                        "AND product = :product"
        )
})

@Getter
@Setter
public class SomeTable {

    public static final String getSomeTableForAmount = "SomeTable.getSomeTableForAmount";

    @Id
    private String id;
    private BigDecimal startingAmount;
    private BigDecimal endingAmount;
    private BigDecimal minimumDueAmount;
    private Product product;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多