gpt4 book ai didi

java - @NamedNativeQuery 和@SqlResultSetMapping 用于非实体

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:06 25 4
gpt4 key购买 nike

我一直在用这个post举个例子。我有一个复杂的连接查询(在此处进行了简化)。它从两个表(以及使用 CASE 的派生列)返回值的子集。我认为我不需要使用实体注释,因为从我的结果集中返回的对象不是我的模式中的实际表。

我想保存连接查询结果的非实体对象:

@SqlResultSetMapping(
name="myMapping",
classes={
@ConstructorResult(
targetClass=CarLimitDelta.class,
columns={
@ColumnResult(name="caseCol"),
@ColumnResult(name="colA"),
@ColumnResult(name="colB"),
}
)
}
)
@NamedNativeQuery(name="CarLimitDelta.getCarLimitDelta",
resultSetMapping="myMapping",
query="SELECT CASE "+
"WHEN t.foo IS NULL THEN 'INS' "+
"WHEN s.foo IS NULL THEN 'DEL' "+
"ELSE 'UPD' "+
"END caseCol "+
", T.bar colA "+
", S.bar ColB "+
"FROM tableA S "+
"FULL JOIN TableB ON S.bar= T.bar")

public class CarLimitDelta {
private String caseCol;
private String colA;
private String colB;


//getters/setters/etc
}

我的 repo :

@Repository
public interface CarLimitRepository extends CrudRepository<CarLimitDelta, String> {
List<CarLimitDelta> getCarLimitDelta();
}

我的服务:

@Service
public class CarLimitService {

@Autowired
CarLimitRepository carLimitRepository ;

public void deleteAll() {
carLimitRepository.deleteAll();
}

public List<CarLimitDelta> getCarLimitDelta() {
return carLimitRepository.getCarLimitDelta();
}


}

我不确定如何让我的存储库看到我的 NamedNativeQuery 中定义的新 CarLimitDelta.getCarLimitDelta native 查询方法。我收到以下错误:

Invalid derived query! No property getCarLimitDelta found for type CarLimitDelta!

最佳答案

@SqlResultSetMapping@NamedNativeQuery 注释需要在 @Entity 上,而不是在非实体 POJO 上。

如果实体是Foo,那么添加注解如下:

@SqlResultSetMapping(
name="myMapping",
classes={
@ConstructorResult(
targetClass=CarLimitDelta.class,
columns={
@ColumnResult(name="caseCol"),
@ColumnResult(name="colA"),
@ColumnResult(name="colB"),
}
)
}
)
@NamedNativeQuery(name="Foo.getCarLimitDelta",
resultSetMapping="myMapping",
query="...")
@Entity
public class Foo {
...
}

请注意,@NamedNativeQuery 名称以实体名称为前缀,例如Foo.getCarLimitDelta

然后将方法添加到 Foo 存储库中:

@Repository
public interface FooRepository extends CrudRepository<Foo, String> {
List<CarLimitDelta> getCarLimitDelta();
}

请注意,方法名称 getCarLimitDelta@NamedNativeQuery 名称相匹配,减去前缀。

关于java - @NamedNativeQuery 和@SqlResultSetMapping 用于非实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49225739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com