我有实体课" Geo"存储使用@SqlResultSetMapping和@NamedNativeQuery的地理空间数据(在数据库中我使用由实体中的WKT String表示的二进制数据)。如果我使用无状态bean和Facade方法调用NamedNativeQueries以及当我只使用Geo对象时,一切都很完美。
当我在相关类中使用Geo对象时,我的问题就出现了。我有实体课' Location'与Geo相关(根据db中的表格),我加入了列:
@JoinColumn(name = "GEOGUID")
@ManyToOne(fetch = FetchType.LAZY)
private Geo geoguid;
geoguid对象始终由标准的EnityManager方法构造: T find(java.lang.Class entityClass,java.lang.Object primaryKey)。
是否有可能以EM将执行定义的本机查询以获取Geo的方式注释字段/列? 也许,在我的情况下还有另一种转换单列数据的方法吗? 我在考虑: - 对db进行隐式转换,即geometry-> varchar, - 使用@Converter实现AttributeConverter
但出于不同的原因,我无法使用它们。
Geo是使用包含字段坐标的@Entity注释的类,如下所示:
@Entity
@Table(name = "geo")
@XmlRootElement
@NamedQueries({....
@NamedNativeQueries({...
@SqlResultSetMappings({...
...
public class Geo implements Serializable
...//other fields
@Basic(optional = false)
@NotNull
@Column(name = "coordinates")
private String coordinates;
...
对应于db表中的二进制数据(在MariaDB中为' Point'类型)。我有如上所述的映射,当我不需要实体管理器获取数据时一切正常。我可以使用自己的nativequeries创建/更新geo,使用find,findAll等创建/更新geo。 DB中的所有记录都是正确的。在其他实体类中使用joincolumn时出现问题,因为地理实例被提取然后通过EM标准查找函数并且坐标未正确转换(它们仍然是字符串,但是像&00; 000000xccvbfrfrdd00000'而不是WKT' POINT (10 10)')。 整个映射只是'astext(coords)'我试图将它放入columndefinition,columnreferencedname等但没有结果。
如何提供已转换的坐标'使用ManyToOne或其他关系的其他类的字段?我可以强制EM以某种方式转换它吗?